Django Manytomany検証
-
27-09-2019 - |
質問
以下のコードをご覧ください。基本的に、ユーザーがこのクラスのオブジェクトを作成するとき、彼らは value_type
. 。もしも value_type==2
(パーセンテージ)、次に percentage_calculated_on
(これは、フォーム/テンプレート側のチェックボックスセレクトマルチプレーズであり、1つ以上のアイテムをチェックする必要があります。モデルの検証は、私がしようとしているように検証することができません。基本的に、インスタンスが必要であることを示す例外をスローします。多くの関係の前に主要なキー値を使用するには、まずオブジェクトを保存する前にオブジェクトを検証する必要があります。フォーム(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.")
解決
プロジェクトの管理者アプリの1つでコードをテストしました。カスタムを使用して必要な検証を実行することができました 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