장고, 아약스 및 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, 내가 뭘 잘못하고 있는지 알 수 있다면, 당신의 의견은 진심으로 감사 할 것입니다.
감사합니다.
'$ ('# register_form')의 내용은 무엇입니까? serialize()'? –