我正在寻找这个常见问题的简单答案。到目前为止,我找到的答案为我们初学者留下了关键点。
我有一个应用程序,其中几乎每个模型都有一个外键到用户,并且有一个 unique_together 约束,其中一个字段始终是“用户”。
例如:
class SubscriberList(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=70)
date_created = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = (
('user', 'name',),
)
def __unicode__(self):
return self.name
订阅者列表总是由登录的用户创建,因此在创建订阅者列表的表单中,我排除了用户字段并在保存表单时给它一个 self.request.user 的值,如下所示:
class SubscriberListCreateView(AuthCreateView):
model = SubscriberList
template_name = "forms/app.html"
form_class = SubscriberListForm
success_url = "/app/lists/"
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
return super(SubscriberListCreateView, self).form_valid(form)
这是随附的表格:
class SubscriberListForm(ModelForm):
class Meta:
model = SubscriberList
exclude = ('user')
使用此代码,有效数据就可以了。当我提交不是unique_together 的数据时,我从数据库中收到一个完整性错误。原因对我来说很清楚 - Django 不验证 unique_together 因为“用户”字段被排除在外。
如何更改我现有的代码,仍然使用 CreateView,以便提交的不是 unique_together 的数据会引发表单验证错误,而不是来自数据库的完整性错误。