【发布时间】:2011-02-12 19:19:21
【问题描述】:
我有两个模型(ModelParent 和 ModelChild),在 Subject 模型上具有相同的 m2m 字段。 ModelChild 在 ModelParent 上有一个外键,并且 ModelChild 在管理页面上被定义为 ModelParent 的内联。
### models.py ###
class Subject(Models.Model):
pass
class ModelParent(models.Model):
subjects_parent = ManyToManyField(Subject)
class ModelChild(models.Model):
parent = ForeignKey(ModelParent)
subjects_child = ManyToManyField(Subject)
### admin.py ###
class ModelChildInline(admin.TabularInline):
model = ModelChild
class ModelParentAdmin(admin.ModelAdmin):
inlines = [ModelChildInline]
admin.site.register(ModelParent, ModelParentAdmin)
不过,我有一个重要的限制,ModelChild 的 subject_child 字段不得引用 subject_parent 对其subject_parent 所做的任何主题。
所以,如果我在两个模型的管理页面上选择相同的主题(在 subject_parent 和 subject_child 中),我该如何验证呢? 如果只有一个字段更改,您将根据数据库对其进行验证,但如果两者都更改(subject_parent 和 subject_child)怎么办? 如何在保存前同时验证两个表单?
【问题讨论】:
-
为什么不在表单的 clean() 中验证它,而不是 field_specific clean?这样,您需要检查的所有字段都将被预先清理。我唯一不确定的是您是否可以访问两组数据,或者仅访问 clean() 中的 ModelParent 数据...
-
感谢您的建议。我已经这样做了,但是对于表单,我只能分别验证主表单(ModelParentAdmin 的表单)和 inilines 表单集(仅针对 db)。我可以一起访问它们的唯一地方是 ModelParentAdmin 类。但是该类没有 clean() 方法。我可以考虑在使用此类的 save_formsets(...) 方法之前验证它们,但是在 raise ValidationError("error") 上什么都没有。
-
我也遇到了同样的问题,但还不知道最好的解决方案是什么。我可以看到这个问题和答案现在已经很老了,而且我确信必须有一个简单的解决方案可以与较新的 django 版本一起使用。有人可以帮忙吗?
标签: python django django-admin django-forms