【问题标题】:How to Handle Error during Django CreateView如何在 Django CreateView 期间处理错误
【发布时间】:2017-12-11 23:37:08
【问题描述】:

使用 Django,我有一个基于提供的 CreateView 类的模型和基于类的视图。一切正常 - 我可以有一个模板来呈现表单、进行验证、正确保存数据并在完成时将 success_url 重定向到。

问题在于我在两个字段上有一个 unique_together 约束。如果遇到此错误,则 form_valid() 似乎没有捕获它,而是生成了一个错误页面。

我的目标是能够提前捕捉到这一点并将用户返回到表单 - 使用他们上次尝试填写的数据 - 并向他们显示一条消息。感觉这样应该很简单,我在视图中的form_valid()中添加了代码来识别问题,但是我不知道下一步该怎么做。

重定向不起作用,因为我无法在其中添加上下文(或者我可以吗?)而且我真的不想将所有内容都放在 URL 中。有什么想法可以去哪里看?

模型:

class Client(BaseModel):
    name = models.CharField(max_length=240, db_index=True, verbose_name='Client Name')
    organization_link = models.ForeignKey(Organization, on_delete=models.PROTECT, verbose_name='Organization')
    client_group_link = models.ForeignKey(ClientGroup, blank=True, on_delete=models.SET_NULL, null=True, verbose_name='Client Group')
    policy_link = models.ManyToManyField(OrganizationPolicy, related_name='attached_clients', verbose_name='Policies')
    active = models.BooleanField(default=True, db_index=True, verbose_name='Active')

    class Meta:
        unique_together = (('name', 'organization_link'),)

观点:

class ClientCreateView(CreateView):
    model = Client
    fields = ['name', 'client_group_link', 'active']
    success_url = reverse_lazy('entities_client_roster')

    def form_valid(self, form):
        organization = get_object_or_404(Organization, id=self.kwargs['organization'])
        form.instance.organization_link_id = organization.id
        return super().form_valid(form)

sn-p URL 配置:

url(r'^client_create/(?P<organization>[0-9a-f-]+)',
    ClientCreateView.as_view(template_name='entities/client_create.html'),

还有错误:

IntegrityError at /accept/client_create/xxx
duplicate key value violates unique constraint "app_entities_client_name_organization_link_id_5e612e47_uniq"

【问题讨论】:

  • 发布你的模板代码,一个你提到的错误页面。
  • 好的 - 代码已发布。模板本身只是通过提交呈现表单,只要我不输入相同的名称两次,它就可以很好地发布新记录。
  • 只是猜测,尝试覆盖post方法并调用super post over a try except block
  • 您创建具有相同名称和组织链接的客户端

标签: python django


【解决方案1】:

感谢@geckos...为我指明了正确的方向。将以下内容添加到我的视图中完成了这项工作:

def post(self, request, *args, **kwargs):
    try:
        super().post(request, *args, **kwargs)
    except IntegrityError:
        messages.add_message(request, messages.ERROR,
                             'You already have registered a Client with this name. ' + \
                             'All of your Client names must be unique.')
        return render(request, template_name=self.template_name, context=self.get_context_data())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2018-04-07
    • 2017-11-07
    • 2017-08-31
    • 1970-01-01
    • 2020-01-19
    • 2012-10-11
    相关资源
    最近更新 更多