2010-10-04 65 views
6

請參閱下面的代碼。基本上,當用戶創建這個類的對象時,他們需要指定value_type。如果value_type==2(百分比),然後percentage_calculated_on(這是一個CheckboxSelectMultiple在表單/模板端需要有一個或多個項目檢查。模型驗證不允許我像我試圖驗證 - 它基本上拋出一個例外,它告訴我,在使用多對多關係之前,實例需要有一個主鍵值,但是我需要在保存之前先驗證對象,我已經在form(modelform)一側(使用形式的清潔方法),但同樣的事情發生也有。django manytomany驗證

如何去實現這個驗證?

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.") 
+0

我已將Manoj Govindan的答案標記爲「接受」,因爲它解決了問題。不過,我仍然希望使用Django的模型驗證進行驗證。所以如果有人有任何想法,請盡力在此發佈。謝謝。 – chefsmart 2010-10-04 12:53:43

+0

同樣的問題:http://stackoverflow.com/questions/7986510/django-manytomany-model-validation – user920391 2013-02-08 16:02:59

回答

2

我在幻燈的一個測試你的代碼cts的管理員應用程序。我能夠使用自定義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爲你做的)許多代表對許多關係。我相信這應該不重要。

+0

Errr ...是'模型'真的是'admin.ModelAdmin'的一個屬性? – 2010-10-04 09:31:39

+0

@ Dominic:這當然不是:P謝謝你指出。我修復了它。 – 2010-10-04 09:34:24

+0

我在我的ModelForm中做類似的事情,除非我先調用super(MyPayableForm,self).clean(),而我使用self.instance.value_type和self.instance.percentage_calculated_on來代替。 – chefsmart 2010-10-04 09:42:41