【问题标题】:Display IntegrityError when trying to validate CreateView based on ModelForm using unique_together尝试使用 unique_together 验证基于 ModelForm 的 CreateView 时显示 IntegrityError
【发布时间】:2015-05-15 21:35:50
【问题描述】:

使用基于类的视图CreateView 时如何显示完整性错误。

我当前的模型如下所示:

class Delivery(models.Model):
    created_date = models.DateTimeField('date created', editable=False)
    modified_date = models.DateTimeField('modified', editable=False)
    user_name = models.ForeignKey(User, null=False)
    stream_name = models.CharField(max_length=50, null=False)
    view_name = models.CharField(max_length=100, null=False, blank=True)
    activity_name = models.CharField(max_length=100, null=False, blank=True)
    jira = models.URLField()
    codereview = models.URLField()
    related_streams = models.CharField(max_length=100, choices=sorted(streams()),blank=True)
    description = models.TextField(null=False,blank=True)
    status = models.BooleanField(default=False, blank=False)

而对应的视图是:

class CreateEntryView(CreateView):
    template_name = 'tracker/entry.html'
    model = Delivery
    success_url = reverse_lazy('table_view')
    status = StreamStatus()
    fields = ['stream_name','view_name','activity_name','jira','codereview','related_streams','description','status']

    def get_initial(self):
        if 'codereview-get' in self.request.GET:
            parsedDict = codereviewParser(self.request.GET['codereview-get'])
            return {'stream_name':parsedDict['stream'].split('_')[1:2][0],
                    'view_name':parsedDict['view'],
                    'activity_name':parsedDict['name'],
                    'jira':parsedDict['jira'],
                    'codereview':self.request.GET['codereview-get'],
                    'description':parsedDict['description'],
                    'status':parsedDict['status']}
        else:
            return self.initial.copy()

    def form_valid(self, form):
        form.instance.user_name = self.request.user
        try:
            return super(CreateEntryView, self).form_valid(form)
        except IntegrityError as e:
                messages.error(self.request, "Your data has not been saved!")
                return HttpResponseRedirect(self.request.path)
        return super(CreateEntryView, self).form_valid(form)

    def get_context_data(self, **kwargs):
        ctx = super(CreateEntryView, self).get_context_data(**kwargs)
        ctx['locked'] = self.status.getLocked()
        ctx['unlocked'] = self.status.getUnlocked()
        return ctx

我通过将新上下文传递给render_to_response() 尝试了几种技术,但随后我需要再次传递整个上下文。还尝试了我不喜欢的HttpResponse(),因为它会将我引导到带有消息的空白页面。我想使用警告消息向用户显示错误。

【问题讨论】:

  • return self.render_to_response(self.get_context_data(form=form, integritymsg='Your data has not been saved!', reason=whatever)) 呢?并检查并在模板中显示integritymsg/reason
  • 啊,看起来很简单。我忘记了 get_context_data 会占用 **kwargs。这很好用。您介意发布答案以便我接受吗:)
  • 有什么地方可以看到CreateView的流程。我有这个链接,但它没有给我流程ccbv.co.uk/projects/Django/1.6/django.views.generic.edit/…

标签: django django-forms django-class-based-views


【解决方案1】:

如何做form_invalid 所做的事情,但将您的信息添加到上下文中:

return self.render_to_response(self.get_context_data(form=form, integritymsg='Your data has not been saved!', reason=whatever))

当然还要检查并在模板中显示integritymsg/reason

有一点不是很明显,传递给get_context_data 的参数被添加到上下文中。沿 MRO 链调用的所有 get_context_data 都将它们的位添加到上下文中。

ccbv.co.uk 是一个很棒的工具。不幸的是,您需要检查代码并自己找出执行流程。这并不复杂,但是是的,图表会有所帮助。 一般从as_view开始,dispatch,get等...

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 2011-01-09
    • 2015-11-22
    • 2021-05-02
    • 1970-01-01
    • 2019-02-10
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多