【发布时间】: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