【问题标题】:Catching integrity error in django generic view for ajax forms在 ajax 表单的 django 通用视图中捕获完整性错误
【发布时间】:2015-05-29 03:23:29
【问题描述】:

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

即。说用户和唯一名称

为了捕捉完整性错误(当用户有重复的唯一名称时),我在普通的 Django 函数中编写了 try 和 except。它适用于 HTML 表单提交。 但是,当我尝试使用 Ajax 提交表单时,我找不到任何方法来捕获错误。

class DataCreate(AjaxableResponseMixin,CreateView): model = Prescriptions fields = ['user','unique_name','x','y','z'] success_url = reverse_lazy('some url')

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(object): """ Mixin to add AJAX support to a form. Must be used with an object-based FormView (e.g. CreateView) """ def form_invalid(self, form): response = super(AjaxableResponseMixin, self).form_invalid(form) if self.request.is_ajax(): return JsonResponse(form.errors, status=400) else: return response

def form_valid(self, form):
    # 我们确保调用父级的 form_valid() 方法,因为
    # 它可能会做一些处理(在 CreateView 的情况下,它会
    # 以调用 form.save() 为例)。
    response = super(AjaxableResponseMixin, self).form_valid(form)
    如果 self.request.is_ajax():
        数据 = {
            “pk”:self.object.pk,
        }
        返回 JsonResponse(数据)
    别的:
        返回响应

【问题讨论】:

    标签: ajax django django-views


    【解决方案1】:

    您应该在 except 子句中返回 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)
    

    【讨论】:

    • 我们不应该使用except IntegrityError as e:吗?
    • 仅当您需要访问异常的实例时。
    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2012-07-04
    • 2013-03-18
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多