Javascript Django:脆表单的Ajax验证
我正在尝试为我的Django站点工作,但我不确定错误应该如何显示。当我提交一个无效表单时,返回的JSON表单似乎与原始表单完全相同,因此我不理解错误响应是如何发生的 按下表单按钮时调用的(缩写)视图:Javascript Django:脆表单的Ajax验证,javascript,python,django,django-crispy-forms,Javascript,Python,Django,Django Crispy Forms,我正在尝试为我的Django站点工作,但我不确定错误应该如何显示。当我提交一个无效表单时,返回的JSON表单似乎与原始表单完全相同,因此我不理解错误响应是如何发生的 按下表单按钮时调用的(缩写)视图: from crispy_forms.utils import render_crispy_form from jsonview.decorators import json_view @login_required @json_view def create_lab_device(request
from crispy_forms.utils import render_crispy_form
from jsonview.decorators import json_view
@login_required
@json_view
def create_lab_device(request, owner):
add_device_form = AddNewDeviceForm(request.POST)
if request.method == 'POST' and add_device_form.is_valid():
# do the stuff to save to database
return {'success':True}
# form not valid, return false with the rendered form
form_html = render_crispy_form(add_device_form)
return {'success':False, 'form_html':form_html}
原始视图中发送的Crispy表单:
from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Button
from crispy_forms.bootstrap import InlineField
class AddNewDeviceForm(forms.Form):
def __init__(self, *args, **kwargs):
super(AddNewDeviceForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'add-new-device-form'
self.helper.form_class = 'form-inline'
self.helper.form_method = 'post'
self.helper.add_input(Button('submit', 'Add', css_class='btn-default'))
self.helper.layout = Layout(
InlineField('name'),
InlineField('ip'),
)
name = forms.CharField(
label="Name",
max_length=30,
required=True,
)
ip = forms.IPAddressField(
label="IP Address",
max_length=15,
required=True,
)
单击按钮时调用的javascript函数:
function add_device_submit(){
var form_id = '#add-new-device-form';
$('#button-id-submit').on("click",function(){
$.ajax({
url: "new/",
type: "POST",
data: $(form_id).serialize(),
success: function(data){
if (!(data['success'])){
$(form_id).replaceWith(data['form_html']);
} else {
$(form_id).find('.success-message').show();
}
},
error: function(){
$(form_id).find('.error-message').show();
}
});
});
};
当我提交表单时只输入“name”字段,我在页面上看不到任何不同的呈现。使用Firebug,我可以看出浏览器正在重新呈现表单,但它替换的数据与表单创建的原始数据完全相同
我应该如何显示表单错误?Crispy教程没有解释错误应该显示在哪里。因此,我最近遇到了一个非常类似的问题,但我意识到阅读javascript和ajax特别有帮助。 首先,你的观点应该是:
@login_required
def create_lab_device(request, owner):
if request.method == 'POST':
add_device_form = AddNewDeviceForm(request.POST)
context_dict={}
if response.is_ajax():
add_device_form.is_valid():
# do the stuff to save to database
context_dict['success']=True
else:
# form not valid, return false with the rendered form
context_dict['success']=False
return JsonResponse(context_dict)
除此之外,呈现的表单不需要发回。请记住,前端已经有一个渲染窗体。使用Ajax是因为它减少了渲染数据的需要。如果“success”返回False,您可以重新设置表单。
还请注意,您将无法向该视图发送GET请求。接下来,我使用了适用于Django 1.7的JsonResponse+
对于早期版本
HttpResponse(json.dumps(context_dict), mimeType="application/json")
应该使用
success: function(data){
if (!(data['success'])){
$(form_id)[0].reset();
} else {
$(form_id).find('.success-message').show();
}
},
error: function(){
$(form_id).find('.error-message').show();
}
记住,错误意味着根本没有收到ajax响应