使用 django 和 ajax 显示表单错误

Rob*_*bin 9 django ajax jquery django-forms

我有一个联系表格,用户可以通过它与我联系。我在 ajax 中使用 django,如果没有错误,它工作正常。如果在输入字段上方显示错误,我想显示错误,而不仅仅是错误,还有输入和错误。然而,它确实区分了successerror结果,因为 ajax 请求是成功的。但我需要显示实际的表单错误。我怎么办?您的帮助将不胜感激。谢谢你。

意见:

def contact(request):
    if request.is_ajax() and request.POST:
        form = ContactForm(request.POST)
        if form.is_valid():
            new_contact = form.save()
            data = {
                'result': 'success',
                'message': 'Message Sent.'
            }
            return JsonResponse(data)
        else:
            data = {
                'result': 'error',
                'message': 'Form invalid',
                'form': 'oops.'
            }
            return JsonResponse(data)
    else:
        form = ContactForm()
        return render(request, 'public_contact.html', {
            'form': form
        })
Run Code Online (Sandbox Code Playgroud)

js:

contact_right_form.find('#submit').on('click', function(event) {
    event.preventDefault();
    $.ajax({
        type: contact_right_form.attr('method'),
        url: '/contact/',
        data: contact_right_form.serialize(),
        dataType: 'json',
        success: function(data) {
            if ( data.result == 'success') {
                contact_right_message_sent.text(data.message);
                contact_right_message_sent.show();
            }
            else {
                contact_right_message_sent.text(data.message);
                contact_right_message_sent.show();
            }
        },
        error: function() {
            contact_right_message_sent.text('Sorry! Something went wrong.')
        }
    });
})
Run Code Online (Sandbox Code Playgroud)

更新

我想显示如下错误,因为它通常在没有 ajax 的情况下显示:

在此处输入图片说明

Yan*_*Sky 9

举个例子

django 表单使用 .json 格式返回 json 格式的错误form.errors.as_json()。认为:

{
    "sender": [
         {
           "message": "Enter a valid email address.", 
           "code": "invalid"
         }
    ],

    "subject": [
          {
            "message": "This field is required.", 
            "code": "required"
          }
    ]
}
Run Code Online (Sandbox Code Playgroud)

之后,ajax 得到一个响应(在success: function(data) {}. 假设已经成为一个对象:

    data = {
    "sender": [
    {
        "message": "Enter a valid email address.", 
      "code": "invalid"
    },
    {
        "message": "Enter a .", 
      "code": "invalid"
    }
  ], 
   "subject": [
    {
        "message": "This field is required.", 
      "code": "required"
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)

并且您已经呈现了以前的形式,假设:

<input type="text" name="sender"> <br>
<input type="text" name="subject"> <br>
<button>Submit</button>
Run Code Online (Sandbox Code Playgroud)

为了呈现这些消息,您可以在点击事件中编写脚本:

// in ajax success (event click)
if ($("input").next('p').length) $("input").nextAll('p').empty();
    for (var name in data) {
    for (var i in data[name]) {
      // object message error django
      var $input = $("input[name='"+ name +"']");
      $input.after("<p>" + data[name][i].message + "</p>");
    }
  }
Run Code Online (Sandbox Code Playgroud)

模拟示例:

{
    "sender": [
         {
           "message": "Enter a valid email address.", 
           "code": "invalid"
         }
    ],

    "subject": [
          {
            "message": "This field is required.", 
            "code": "required"
          }
    ]
}
Run Code Online (Sandbox Code Playgroud)
    data = {
    "sender": [
    {
        "message": "Enter a valid email address.", 
      "code": "invalid"
    },
    {
        "message": "Enter a .", 
      "code": "invalid"
    }
  ], 
   "subject": [
    {
        "message": "This field is required.", 
      "code": "required"
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)


mar*_*dev 6

您需要为 定义status_code参数JsonResponse

return JsonResponse(data, status_code=400)
Run Code Online (Sandbox Code Playgroud)

这样它就会error在 $.ajax的回调中结束。

  • 使用“form.errors.as_json()”,然后在js端进行迭代。 (2认同)
  • 您还可以通过简单地使用 ajax 渲染整个 html 来避免这一切,因此错误会在后端渲染,然后您发送整个表单 html。网上有很多关于这个解决方案的帮助,所以请先搜索一下。 (2认同)
  • 尝试使用[Kenneth Love 描述的技术](http://brack3t.com/ajax-and-django-views.html)。它使用一些 JS 辅助函数通过 Ajax 处理和呈现表单字段错误,其方式类似于基本 Django 消息。 (2认同)