2010-10-04 8 views
6

S'il vous plaît voir le code ci-dessous. Fondamentalement, lorsque l'utilisateur crée un objet de cette classe, ils doivent spécifier le value_type. Si value_type==2 (pourcentage), puis percentage_calculated_on (qui est un CheckboxSelectMultiple du côté formulaire/modèle doit avoir un ou plusieurs éléments vérifiés.La validation du modèle ne me permet pas de valider comme je suis en train de - il jette fondamentalement un exception qui me dit que l'instance doit avoir une valeur de clé primaire avant qu'une relation many-to-many puisse être utilisée.Mais je dois d'abord valider l'objet avant de l'enregistrer.J'ai essayé cette validation du côté formulaire (modelform) (en utilisant la méthode propre de la forme), mais la même chose se passe là aussi.django manytomany validation

Comment puis-je faire pour réaliser cette validation?

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

J'ai répondu que la réponse de Manoj Govindan est «acceptée» car elle résout le problème. Cependant, j'aimerais quand même le faire valider en utilisant la validation du modèle de Django. Donc, si quelqu'un a des idées, faites l'effort de les afficher ici. Merci. – chefsmart

+0

même question: http://stackoverflow.com/questions/7986510/django-manytomany-model-validation – user920391

Répondre

2

Je l'ai testé votre code dans un de mes proje l'application d'administration de cts. J'ai été en mesure d'effectuer la validation requise en utilisant un ModelForm personnalisé. Voir ci-dessous.

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

L'application Admin utilise le widget SelectMultiple (plutôt que CheckboxSelectMultiple comme vous le faites) pour représenter plusieurs à plusieurs relations. Je crois que cela ne devrait pas importer cependant.

+0

Errr ... est 'model' vraiment un attribut de' admin.ModelAdmin'? –

+0

@Dominic: Ce n'est certainement pas: P Merci de l'avoir signalé. Je l'ai réparé. –

+0

Je fais quelque chose de similaire dans mon ModelForm, sauf que j'appelle super (MyPayableForm, self) .clean() d'abord et que j'utilise self.instance.value_type et self.instance.percentage_calculated_on à la place. – chefsmart

Questions connexes