Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django:脆表单的Ajax验证_Javascript_Python_Django_Django Crispy Forms - Fatal编程技术网

Javascript Django:脆表单的Ajax验证

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

我正在尝试为我的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, 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响应