2010-10-04 2 views
6

Bitte beachten Sie den folgenden Code. Wenn der Benutzer ein Objekt dieser Klasse erstellt, müssen sie die value_type angeben. Wenn value_type==2 (Prozent), dann percentage_calculated_on (das ist ein CheckboxSelectMultiple auf der Formular/Template-Seite muss eines oder mehrere Elemente überprüft haben. Die Modellvalidierung erlaubt mir nicht zu validieren, wie ich versuche - es wirft im Grunde eine Ausnahme, die mir sagt, dass die Instanz einen Primärschlüsselwert haben muss, bevor eine Viele-zu-Viele-Beziehung verwendet werden kann.Ich muss jedoch zuerst das Objekt validieren, bevor ich es speichere.Ich habe diese Validierung auf der Formularseite (Modellform) versucht (unter Verwendung des saubere Methode des Formulars), aber das gleiche passiert auch dort.django manytomany Validierung

Wie gehe ich über diese Validierung zu erreichen?

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

Ich habe Manoj Govindans Antwort unten als "akzeptiert" markiert, da sie das Problem löst. Ich würde es dennoch gerne mit Djangos Modellvalidierung validieren lassen. Also, wenn jemand irgendwelche Ideen hat, bemühe dich, es hier zu posten. Vielen Dank. – chefsmart

+0

gleiche Frage: http://stackoverflow.com/questions/7986510/django-manytomany-model-validation – user920391

Antwort

2

getestet habe ich aus Ihrem Code in einen meiner proje cts 'Admin-App. Ich konnte die erforderliche Validierung durchführen, indem ich eine benutzerdefinierte ModelForm verwendete. Siehe unten.

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

Die Admin-App verwendet das SelectMultiple Widget (statt CheckboxSelectMultiple wie Sie tun) viele, viele Beziehungen zu vertreten. Ich glaube, das sollte aber keine Rolle spielen.

+0

Errr ... ist 'Modell' wirklich ein Attribut von' admin.ModelAdmin'? –

+0

@Dominic: Es ist ganz sicher nicht: P Danke für das Aufzeigen. Ich habe es behoben. –

+0

Ich mache etwas ähnliches innerhalb meiner ModelForm, außer ich rufe zuerst super (MyPayableForm, self) .clean() auf und verwende stattdessen self.instance.value_type und self.instance.percentage_calculated_on. – chefsmart

Verwandte Themen