我有以下型号:
class Computer(models.Model):
...
class Demo(models.Model):
computers = models.ManyToManyField(Computer)
...
class Scenario(models.Model):
demo = models.ForeignKey(Demo)
...
class Setting(models.Model):
scenario = models.ForeignKey(Scenario)
computer = models.ForeignKey(Computer)
Demo基本上使用多台计算机。演示还有多个场景。每个方案都有一些设置,每个设置都配置一台计算机。
我的问题是在使用django管理站点添加方案时,在用户在下拉列表中选择一个演示并配置某些计算机的设置后,我需要验证设置中的计算机是否实际位于演示。
我已经浏览了django文档,在线网站,并尝试了我能想到的一切,但仍然无法完成这项工作。
我无法使用自定义表单验证,因为虽然我可以从方案表单中的cleaning_data获取'demo'对象,但我似乎无法访问随表单提交的设置。如果我通过覆盖'clean'进行模型级别验证,那只有在我更改场景时才有效,而不是在我添加新场景时,因为computer_set对于新场景是空的。
非常感谢任何帮助。
答案 0 :(得分:2)
您只需向SettingInline
添加自定义表单(我假设您的帖子Setting
是Scenario
的内联网。)
您提到您无法使用表单验证,但我没有看到您需要访问其他所有设置的原因。如果您想要访问其他设置(比如涉及所有提交设置的验证),我会覆盖formset
本身。
class SettingForm(forms.ModelForm):
class Meta:
model = Setting
def clean_computer(self):
computer = self.cleaned_data.get('computer')
if not self.instance.scenario.demo.computers.filter(computer=computer).count():
raise forms.ValidationError("Computer not in demo")
return computer
class SettingInline(admin.TabularInline):
model = Setting
form = SettingForm