我正在尝试通过对具有特定值的字段进行过滤的查询集来验证模型集,其中添加的任何表单都需要具有该特定值集。
我是Django的相对入门者,希望对我的要求有一个“标准”答案,我觉得这不是很不寻常。
出于这个问题的目的,我有三个模型-项目,阶段和检查。
约束是项目和阶段的每个组合最多只能有一个检查。
在模型级别,可以通过以下方式实现:
class Meta:
constraints = [models.UniqueConstraint(fields=['project', 'stage'], name="project-stage"),]
其中project
和stage
是Check模型中的ForeignKey字段,并且可以使用。
我有一个带有modelformset的视图,该视图显示了给定项目的所有检查。 视图查询集为
models.Check.objects.filter(project__id=pk)
其中pk是网址中的整数(例如project/1/
)。
在ModelForms中,项目字段被排除,因为它是固定的,用户不需要在每种表单中都看到它。因此,它在表单数据中(已清除或其他情况)均不可用,我必须自己插入。
我正在视图中插入project_id的正确值:
if request.method == 'POST':
formset = forms.CheckFormSet(request.POST, queryset=queryset,)
if formset.is_valid():
for form in formset:
if form.has_changed():
form.instance.project_id = pk
form.save()
这似乎是错误的:is_valid()
通过(只要给出了必填字段),但显然应该是错误的-但是我看不到任何可以插入project_id = pk
的地方。然后save()
会导致IntegrityError,这对于用户来说只是服务器错误500。
如果我可以将项目值传递给表单类,则可以验证project
中stage
和form.clean()
的组合,但似乎没有办法-CheckFormSet是一个modelformset_factory
,我无法向签名添加任何参数或修改类。
是否有更好的方法来处理?仅在表单中包含项目字段以进行验证似乎很麻烦。