سؤال

الرجاء مراجعة التعليمات البرمجية أدناه. في الأساس ، عندما ينشئ المستخدم كائنًا من هذه الفئة ، يحتاجون إلى تحديد value_type. إذا value_type==2 (النسبة المئوية) ، ثم percentage_calculated_on (وهو عبارة عن مخطط checkseSeSeSeSeSeSonectMultiple على جانب النموذج/القالب ، يحتاج إلى فحص عنصر واحد أو أكثر. إن التحقق من صحة النموذج لا يسمح لي بالتحقق من صحة كما أحاول - إنه يرمي بشكل أساسي استثناء يخبرني أن المثيل يحتاج للحصول على قيمة رئيسية أساسية قبل استخدام علاقة عديدة إلى العديد. لكنني بحاجة أولاً إلى التحقق من صحة الكائن قبل حفظه. لكن الشيء نفسه يحدث هناك أيضًا.

كيف يمكنني تحقيق هذا التحقق من الصحة؟

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 كما تفعل) لتمثيل الكثير للعديد من العلاقات. أعتقد أن هذا لا ينبغي أن يهم رغم ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top