在 ajax 表单的 Django 通用视图中捕获完整性错误

Catching integrity error in django generic view for ajax forms

在 django CreateView 中,我有两个字段应该是唯一的。

即。说用户和 unique_name

为了捕获完整性错误(当用户有重复项时 unique_name),我在正常的 Django 函数中编写了 try 和 except。它适用于 HTML 表单提交。 但是,当我尝试使用 Ajax 提交表单时,我找不到捕获错误的方法。

class数据创建(AjaxableResponseMixin,CreateView): 型号 = 处方 字段 = ['user','unique_name','x','y','z'] success_url = reverse_lazy('some url')</p> <pre><code>def form_valid(self, form): form.instance.user = self.request.user try: return super(DataCreate, self).form_valid(form) except IntegrityError: form.add_error('unique_name','You already have a user by that name') return render_to_response('html') def save(self): request.session['unique_name'] = self.object.unique_name super(DataCreate,self).save() </code>

注意:Ajax Mixin 取自 Django Documentation(1.7),如下所示。 class AjaxableResponseMixin(对象): """ Mixin 为表单添加 AJAX 支持。 必须与基于对象的 FormView(例如 CreateView)一起使用 """ def form_invalid(self, form): response = super(AjaxableResponseMixin, self).form_invalid(表格) 如果 self.request.is_ajax(): returnJsonResponse(form.errors,状态=400) 别的: return 回应</p> <pre>def form_valid(self, form): # We make sure to call the parent's form_valid() method because # it might do some processing (in the case of CreateView, it will # call form.save() for example). response = super(AjaxableResponseMixin, self).form_valid(form) if self.request.is_ajax(): data = { 'pk': self.object.pk, } return JsonResponse(data) else: return response

您应该在 except 子句中 return form_invalid 而不是使用 render_to_response

def form_valid(self, form):
    form.instance.user = self.request.user
    try:
        return super(DataCreate, self).form_valid(form)
    except IntegrityError:
        form.add_error('unique_name','You already have a user by that name')
        return self.form_invalid(form)