Django的多对多验证
-
27-09-2019 - |
题
请参见下面的代码。基本上,当用户创建这个类的一个对象,就需要指定value_type
。如果value_type==2
(百分比),然后percentage_calculated_on
(这是一个CheckboxSelectMultiple的表单/模板侧需要有一个或多个项目检查的模型验证是不是让我来验证像我想 - 它基本上抛出例外,告诉我该实例需要有一个主键值的许多一对多可用于关系之前,但我保存它之前需要先验证的对象。我试图在窗体上(的ModelForm)侧以此验证(使用形式的清洁方法),但同样的事情发生有太多。
我如何去实现这个验证?
INHERENT_TYPE_CHOICES = ((1, 'Payable'), (2, 'Deductible'))
VALUE_TYPE_CHOICES = ((1, 'Amount'), (2, 'Percentage'))
class Payable(models.Model):
name = models.CharField()
short_name = models.CharField()
inherent_type = models.PositiveSmallIntegerField(choices=INHERENT_TYPE_CHOICES)
value = models.DecimalField(max_digits=12,decimal_places=2)
value_type = models.PositiveSmallIntegerField(choices=VALUE_TYPE_CHOICES)
percentage_calculated_on = models.ManyToManyField('self', symmetrical=False)
def clean(self):
from django.core.exceptions import ValidationError
if self.value_type == 2 and not self.percentage_calculated_on:
raise ValidationError("If this is a percentage, please specify on what payables/deductibles this percentage should be calculated on.")
解决方案
我在我的项目管理应用程序中的一个测试你的代码。我能够完成你需要通过使用自定义ModelForm
验证。见下文。
# forms.py
class MyPayableForm(forms.ModelForm):
class Meta:
model = Payable
def clean(self):
super(MyPayableForm, self).clean() # Thanks, @chefsmart
value_type = self.cleaned_data.get('value_type', None)
percentage_calculated_on = self.cleaned_data.get(
'percentage_calculated_on', None)
if value_type == 2 and not percentage_calculated_on:
message = "Please specify on what payables/deductibles ..."
raise forms.ValidationError(message)
return self.cleaned_data
# admin.py
class PayableAdmin(admin.ModelAdmin):
form = MyPayableForm
admin.site.register(Payable, PayableAdmin)
在管理应用程序使用SelectMultiple
部件(而不是CheckboxSelectMultiple
为你做的)许多代表对许多关系。我认为,这不应该的问题虽然。
不隶属于 StackOverflow