2010-10-04 25 views
6

Proszę zobaczyć poniższy kod. Zasadniczo, gdy użytkownik tworzy obiekt tej klasy, musi podać wartość value_type. Jeśli value_type==2 (procent), to percentage_calculated_on (co jest CheckboxSelectMultiple na stronie formularza/szablonu musi mieć zaznaczone jeden lub więcej elementów.) Walidacja modelu nie pozwala mi na sprawdzenie, jak próbuję - to w zasadzie wyrzuca wyjątek, który mówi mi, że instancja musi mieć wartość klucza podstawowego, zanim będzie można użyć relacji wiele do wielu.Ale muszę najpierw sprawdzić obiekt przed zapisaniem.Spróbowałem to sprawdzanie po stronie formularza (modelform) (przy użyciu metody czystej postaci jest), ale to samo dzieje się tam.sprawdzanie poprawności django

Jak mogę iść o osiągnięciu tego walidację?

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

Podałem poniżej odpowiedź Manoj Govindana jako "zaakceptowaną", ponieważ rozwiązuje problem. Chciałbym jednak, aby był on sprawdzany za pomocą sprawdzania poprawności modelu Django. Jeśli więc ktoś ma jakieś pomysły, postaraj się opublikować go tutaj. Dzięki. – chefsmart

+0

to samo pytanie: http://stackoverflow.com/questions/7986510/django-manytomany-model-validation – user920391

Odpowiedz

2

testowałem swój kod w jednej z moich PROJE aplikacja administratora cts. Udało mi się przeprowadzić walidację wymaganą przy użyciu niestandardowego ModelForm. Zobacz poniżej.

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

Aplikacja administracyjna wykorzystuje widget SelectMultiple (zamiast CheckboxSelectMultiple jak ty) do reprezentowania wiele do wielu relacji. Wierzę, że to nie powinno mieć znaczenia.

+0

Błąd ... jest "modelem" tak naprawdę atrybutem 'admin.ModelAdmin'? –

+0

@Dominic: Z całą pewnością nie jest: P Dzięki za wskazanie tego. Naprawiłem to. –

+0

Robię coś podobnego w moim ModelForm, ale najpierw nazywam super (MyPayableForm, self) .clean() i używam zamiast tego self.instance.value_type i self.instance.percentage_calculated_on. – chefsmart