在Django中返回AJAX请求的表单错误

Mri*_*lla 15 django ajax jquery django-forms

我一直在寻找Django和jQuery的方法.我在Django中构建了一个基本表单.在单击提交时,我正在使用jQuery向服务器发出AJAX请求以发布我的数据.这一点似乎工作正常,我已设法保存数据.当表单无效时,Django返回ValidationError.谁能告诉我如何返回这组错误消息作为对我的AJAX请求的响应,所以我可以轻松地使用JS迭代它并做任何事情?

我找到了这个片段.查看JS位(processJson),您会看到他似乎通过从响应HTML中提取错误消息来获取错误消息.这对我来说似乎有些愚蠢.这是最好的方式吗?

我对任何模糊的道歉.

提前致谢.

jar*_*red 11

这个问题很老,但我认为最简单的答案可能是在这样的视图中使用简单的json.

from django.utils import simplejson

def ajax(request):
    if request.method == 'POST':
        form = someForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponse(something)
        else:
            errors = form.errors
            return HttpResponse(simplejson.dumps(errors))
    else:
        return HttpResponse(something)
Run Code Online (Sandbox Code Playgroud)

现在您可以访问您的jquery中的数据,如上面描述的Calvin.Jquery可以轻松处理数据,您可以这样做:

var errors = jQuery.parseJSON(data)
    alert(errors.username)
Run Code Online (Sandbox Code Playgroud)


Mri*_*lla 4

哇,自从我看到这个帖子以来已经一年了。好吧,随着 Django 1.3 和神奇的、未记录的基于类的视图的出现,扩展 Django 的视图相关功能变得更加容易。我的项目大量使用 Django 基于类的通用 CRUS 视图,需要 AJAX 和 JSON 功能。我添加了一个示例,说明如何修改 Django 的更新视图以支持 AJAX 并以 JSON 格式返回 AJAX 响应。看一看:

\n\n
def errors_to_json(errors):\n    """\n    Convert a Form error list to JSON::\n    """\n    return dict(\n            (k, map(unicode, v))\n            for (k,v) in errors.iteritems()\n        )\n\nclass HybridUpdateView(UpdateView):\n    """\n    Custom update generic view that speaks JSON\n    """\n    def form_valid(self, form, *args, **kwargs):\n        """\n        The Form is valid\n        """\n        form.save()\n\n        self.message = _("Validation passed. Form Saved.")\n        self.data = None\n        self.success = True\n\n        payload = {\'success\': self.success, \'message\': self.message, \'data\':self.data}\n\n        if self.request.is_ajax():\n            return HttpResponse(json.dumps(payload),\n                content_type=\'application/json\',\n            )\n        else:\n            return super(HybridUpdateView, self).form_valid(\n                form, *args, **kwargs\n            )\n\n    def form_invalid(self, form, *args, **kwargs):\n        """\n        The Form is invalid\n        """\n        #form.save()\n\n        self.message = _("Validation failed.")\n        self.data = errors_to_json(form.errors)\n        self.success = False\n\n        payload = {\'success\': self.success, \'message\': self.message, \'data\':self.data}\n\n        if self.request.is_ajax():\n            return HttpResponse(json.dumps(payload),\n                content_type=\'application/json\',\n            )\n        else:\n            return super(HybridUpdateView, self).form_invalid(\n                form, *args, **kwargs\n            )\n
Run Code Online (Sandbox Code Playgroud)\n\n

响应 JSON 包含三个字段 \xe2\x80\x94 message(这是人类可读的消息)、data(在这种情况下将是表单错误列表)和success(是truefalse,分别指示请求是否成功.)。这在 jQuery 客户端中很容易处理。响应示例如下所示:

\n\n
Content-Type: application/json\n\n{"message": "Validation failed.", "data": {"host": ["This field is required."]}, "success": false}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这只是我如何将表单错误序列化为 JSON 并在基于类的通用视图中实现它的示例,但也可以进行拆分以使用常规样式视图。

\n