2010-10-04 24 views
6

Lütfen aşağıdaki kodu inceleyin. Temel olarak, kullanıcı bu sınıfın bir nesnesini oluşturduğunda, value_type belirtmelidir. . Temelde bir atar - value_type==2 (yüzde), daha sonra formu/şablonu tarafında bir CheckboxSelectMultiple olan percentage_calculated_on (model doğrulama ben çalışıyorum gibi bana doğrulamak için izin vermiyor bir veya daha fazla öğe kontrol edilmesi gerekmez bir çoktan çoğa ilişkiden önce bir birincil anahtar değere sahip olması gerektiğini söyleyen istisna. Ama önce kaydetmeden önce nesneyi doğrulamam gerekiyor.bu formda (validasyon formu) bu doğrulamayı denedim. (formun temiz yöntemini kullanarak), ama aynı şey orada da olur.django manytomany doğrulama

Bu doğrulama elde etme konusunda gitmek nasıl?

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'ın cevabını, problemi çözdüğü için "kabul edildi" olarak işaretledim. Ancak, yine de Django'nun model doğrulamasını kullanarak doğrulanmasını isterim. Yani, herhangi bir fikri varsa, burada yayınlamak için çaba sarf et. Teşekkürler. – chefsmart

+0

aynı soru: http://stackoverflow.com/questions/7986510/django-manytomany-model-validation – user920391

cevap

2

benim Proje A.Ş. birinde kodunu test cts 'admin uygulaması. Özel bir ModelForm kullanarak istediğiniz doğrulamayı gerçekleştirebildim. Aşağıya bakınız. (Sizin gibi yerine CheckboxSelectMultiple)

# 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) 

Yönetici uygulaması çok ilişkileri için birçok temsil etmek SelectMultiple widget'ı kullanır. Bunun önemli olmamasına inanıyorum.

+0

Errr ... 'model' gerçekten' admin.ModelAdmin' bir özelliğidir? –

+0

@Dominic: Bu kesinlikle değil: P Bunu işaretlediğiniz için teşekkürler. Onu tamir ettim. Benim ModelForm içinde benzer bir şey yapıyorum –

+0

, ben (MyPayableForm, kendinden) .clean() Birinci ve ben self.instance.value_type ve self.instance.percentage_calculated_on yerine kullandıkları süper diyoruz hariç. – chefsmart

İlgili konular