2013-08-09 5 views
3

장고, 아약스 및 jquery와 관련하여 초보자가 됨으로서 제 질문이 사소한 것이라면 미리 사과드립니다.Django Ajax ModelForm이 request.POST에 빈 양식을 제출합니다.

저는 잠시 동안이 문제를 고민해 왔지만, jQuery UI가 제공하는 모달 대화 상자 창을 통해 장고 ModelForm 양식을 제출하기 위해 ajax와 jquery를 사용하려고합니다. 내가 겪고있는 문제는 양식 데이터가 요청에 전달되지 않았거나 내 views.py 파일의 양식 객체에 reqest.POST 객체를 구문 분석하는 데 문제가있는 것 같습니다. 양식을 제출할 때마다 form.is_valid()가 실패하고 양식 오류를 검토하면 양식의 모든 입력에 대해 "이 필드가 필요합니다."라는 메시지가 나타납니다. 그래서 내가 뭘 잘못하고 있는지, 그 문제의 양식은 "모달"아약스로 그것을 시도하기 전에 일했다.

여기 내 코드가 있습니다. 더 노련한 눈으로 내가 놓친 것을 볼 수 있습니다. 레지스터 modal.html 마지막으로 여기

<form action="{% url 'modal_registration' %}" method="post" id="register_form" name="register_form"> 
    {% csrf_token %} 
    <table> 
     <tbody> 
     <tr> 
      <th><label for="first_name">First Name:</label></th> 
      <td>{{ form.first_name }}</td> 
     </tr> 
     <tr> 
      <th><label for="last_name">Last Name:</label></th> 
      <td>{{ form.last_name }}</td> 
     </tr> 
     <tr> 
      <th><label for="email">Email:</label></th> 
      <td>{{ form.email }}</td> 
     </tr> 
     <tr> 
      <th><label for="username">Username:</label></th> 
      <td>{{ form.username }}</td> 
     </tr> 
     <tr> 
      <th><label for="password">Password:</label></th> 
      <td>{{ form.password }}</td> 
     </tr> 
     <tr> 
      <th><label for="password1">Verify Pswd:</label></th> 
      <td>{{ form.password1 }}</td> 
     </tr> 
     <tr> 
      <th><label for="department">Department:</label></th> 
      <td>{{ form.department }}</td> 
     </tr> 
     </tbody> 
    </table> 
</form> 
<span id="registration_error" name="registration_error" style="color: #FF0000;"></span> 

입니다 :

여기

from django.http import HttpResponse 
from django.contrib.auth.models import User 
from django.shortcut import render 
from django.template.defaultfilters import slugify 
from django.utils.functional import Promise 
from django.utils.encoding import force_text 
from django.shortcuts import render 

from artists.forms import RegistrationForm 
from artists.models import Artist 
import json 

class LazyEncoder(json.JSONEncoder): 
    def default(self, obj): 
    if isinstance(obj, Promise): 
     return force_text(obj) 
    return super(LazyEncoder, self).default(obj) 

def ValidateEmail(email): 
    from django.core.validators import validate_email 
    from django.core.exception import ValidationError 
    try: 
     validate_email(email) 
     return True 
    except ValidationError: 
     return False 

def ArtistRegistration(request): 
    form = False 

    if request.method == 'POST' and request.is_ajax(): 
     form = RegistrationForm(request.POST) 
     if form.is_Valid(): 
      is_valid = True 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      password1 = form.cleaned_data['password1'] 
      email = form.cleaned_data['email'] 
      first_name = form.cleaned_data['first_name'].title() 
      last_name = form.cleaned_data['last_name'].title() 

      if ValidateEmail(email) is False: 
       is_valid = False 
       message = "Email entry is invalid." 

      if User.objects.filter(username=username).exists(): 
       is_valid = False 
       message = "Username already exists." 

      if password != password1: 
       is_valid = False 
       message = "Passwords do not match." 

      if is_valid is False: 
       response_dict = {"type": "error"} 
       response_dict["message"] = message 
       result = json.dumps(response_dict, cls=LazyEncoder) 
       return HttpResponse(result, mimetype='application/json') 
      else: 
       user = User.objects.create_user) 
        username = username, 
        email = email, 
        password = password, 
        first_name = first_name, 
        last_name = last_name_ 
       user.save() 
       artist = Artist(
        user = user, 
        first_name = first_name, 
        last_name = last_name, 
        work_email = email, 
        slug = slugify('%s %s' % (first_name, last_name)), 
        department=form.cleaned_data['department']) 
       artist.save() 

       response_dict = {'status':1, 'type':'success'} 
       result = json.dumps(response_dict, cls=LazyEncoder) 
       return HttpResponse(result, mimetype='application/json') 
     else: 
      response_dict = {'type': 'error'} 
      response_dict['message'] = 'form is invalid' 
      response_dict['errors'] = json.dumps(form.errors) 
      result = json.dumps(response_dict, cls=LazyEncoder) 
      return HttpResponse(result, mimetype='application/json') 

    else: 
     form = RegistrationForm() 
     context = {'form' : form} 
     return render(request, 'register-modal.html', context) 

forms.py

from django.forms import ModelForm 
from artists.views import Artist 

class RegistrationForm(ModelForm): 
    username = forms.CharField(label=(u'User Name')) 
    first_name = forms.CharField(label=(u'First Name')) 
    last_name = forms.CharField(label=(u'Last Name')) 
    email = forms.EmailField(label=(u'Email')) 
    password = forms.CharField(label=(u'Password'), 
           widget=forms.PasswordInput(render_value=False)) 
    password = forms.CharField(label=(u'Verify Password'), 
           widget=forms.PasswordInput(render_value=False)) 

    class Meta: 
     model = Artist 
     exlude = (user, slug, work_email) 

views.py

내 모달 대화 호출이 HTML입니다 모든 jquery와 ajax 호출을 만드는 js 파일. Django 문서에서 그대로 복사되기 때문에 csrf 부분을 생략했습니다.

register.js

$(document).ready(function() { 
    $.ajaxSetup({traditional: true}); 

    var $register_dialog = $('#modal_register_div').dialog({ 
     autoOpen: false, 
     title: "User Registration", 
     closeOnEscape: true, 
     draggable: false, 
     resizable: false, 
     modal: true, 
     width: 450, 
     buttons: { 
      "Register": function() { 
       var $this = $(this); 
       var frm = document.form['register_form']; 
       $.ajax({ 
        type: frm.method, 
        url: frm.action, 
        data: $('#register_form').serialize(), 
        contentType: "application/json;charset=utf-8", 
        dataType: 'json', 
        success: function(response){ 
         if(response['type'] == 'success') { 
          //any extra success functionality goes here 
          $this.dialog("close"); 
         } else { 
          $("#registration_error").html(response['message']); 
          console.log(response['errors']); 
         } 
        }, 
        error: function(xhr, ajaxOptions, thrownError) { 
         alert(thrownError + '\n' + xhr.status + '\n' + ajaxOptions) 
        } 
       }); 
       return false; 
      } 
     } 
    }); 

    $('#register_artist').live("click", function() { 
     $.ajax({ 
      type: 'get', 
      dataType: 'html', 
      url: '/register/' 
      data: {}, 
      success: function(response){ 
       $register_dialog.empty().html(response).dialog('open'); 
      } 
     }); 
    }); 
}); 

모달 대화 상자가 내 장고 페이지에 대한 기본 템플릿 페이지에 숨겨진 DIV에 연결되고, JS 스크립트가 같은 페이지에로드됩니다. 대화 상자는 null href 링크를 클릭하여 호출됩니다. anyrate, 내가 뭘 잘못하고 있는지 알 수 있다면, 당신의 의견은 진심으로 감사 할 것입니다.

감사합니다.

+0

'$ ('# register_form')의 내용은 무엇입니까? serialize()'? –

답변

4

내 어리 석음이 무엇인지 알아 냈습니다. 그것은 다음과 같은 있었어야 할 때 contentType: 'application/json;charset=utf-8'

: 나의 아약스 호출에서 내 콘텐츠 유형을 정의했다 contentType: 'application/x-www-form-urlencoded;charset=utf-8'

나는 비교 일하는 내 로그인 폼의 헤더 데이터보고 후 실현 내 등록 양식은 내 로그인 양식에서 데이터가 "Form_Data"를 통해 요청에 전달되는 반면 등록 양식은 "Request_Payload"로 전달됩니다. 변화를 한 후에 모든 것이 매력처럼 작동했습니다.

+0

당신은 대답을 받아 들여야합니다. –

+1

덕분에, 저는 스택 멍청한 놈입니다. 그래서 그것을 간과했습니다. – kanakaRed

관련 문제