我有以下资料:
class AccountAdmin(models.Model):
account = models.ForeignKey(Account)
is_master = models.BooleanField()
name = models.CharField(max_length=255)
email = models.EmailField()
class Meta:
unique_together = (('Account', 'is_master'), ('Account', 'username'),)
如果我创建一个新的AccountAdmin,其用户名与同一帐户上的另一个相同,而不是在模板中显示一个错误,而是用integriterror中断,页面将消失。我希望在我看来,我可以去:
if new_accountadmin_form.is_valid():
new_accountadmin_form.save()
我该如何克服这个问题。是否有第二种is_valid()
类型的方法检查数据库是否违反了unique_together = (('Account', 'is_master'), ('Account', 'username'),)
部分?
在我看来,我不想非得抓住一个整数错误。这是域逻辑和表示逻辑的混合。这违反了DRY,因为如果我在两页上显示相同的表单,我将不得不重复相同的块。这也违反了DRY,因为如果我有两种形式的同一件事,我必须写相同的除了:再次。
以一种完全通用的方式。在模型中有以下两个助手fn:
以及
在表格中有以下fn:
有两种选择:
a)使用一个try块保存模型并捕获integriterror并处理它。类似于:
b)在表单的clean()方法中,检查a行是否存在,并用适当的消息引发一个
forms.ValidationError
。示例here。所以,b)是。。。这就是为什么我referenced the documentation; all you need is there.
但它会像:
值得一提的是,我刚刚意识到,上面提到的unique_引用了一个名为username的字段,这个字段在模型中没有表示。
上面的clean方法是在调用各个字段的所有clean方法之后调用的。
Model.Meta.unique_一起创建一个限制到数据库的约束,而ModelForm.is_valid()主要基于正确的类型。事件如果它确实检查了约束,则您将有一个竞赛条件,该条件仍可能在save()调用中导致IntegrityRor。
你可能想抓住整数错误:
相关问题 更多 >
编程相关推荐