2010-10-04 26 views
6

Por favor, vea el código a continuación. Básicamente, cuando el usuario crea un objeto de esta clase, necesita especificar el value_type. Si es value_type==2 (porcentaje), entonces percentage_calculated_on (que es un CheckboxSelectMultiple en el lado de formulario/plantilla necesita tener uno o más elementos marcados. La validación del modelo no me permite validar como lo estoy intentando - básicamente arroja un excepción que me dice que la instancia necesita tener un valor de clave primaria antes de que se pueda usar una relación muchos a muchos. Pero primero necesito validar el objeto antes de guardarlo. He intentado esta validación en el lado del formulario (modelo) (utilizando el método de limpieza de la forma), pero lo mismo sucede allí también.django manytomany validación

¿Cómo hago para lograr esta validación?

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

He marcado a continuación la respuesta de Manoj Govindan como "aceptada", ya que resuelve el problema. Sin embargo, me gustaría que se validara usando la validación del modelo de Django. Entonces, si alguien tiene alguna idea, haga el esfuerzo de publicarla aquí. Gracias. – chefsmart

+0

misma pregunta: http://stackoverflow.com/questions/7986510/django-manytomany-model-validation – user920391

Respuesta

2

probé a cabo su código en uno de mis proje aplicación de administración de cts Pude realizar la validación que requería al usar un ModelForm personalizado. Vea abajo.

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

La aplicación de administración utiliza el widget SelectMultiple (en lugar de CheckboxSelectMultiple como lo hace) para representar relaciones muchos a muchos. Creo que esto no debería importar sin embargo.

+0

Errr ... ¿es 'model' realmente un atributo de' admin.ModelAdmin'? –

+0

@Dominic: Ciertamente no lo es: P Gracias por señalarlo. Lo he arreglado –

+0

Estoy haciendo algo similar dentro de mi ModelForm, excepto que primero llamo a super (MyPayableForm, self) .clean() y que en su lugar utilizo self.instance.value_type y self.instance.percentage_calculated_on. – chefsmart

Cuestiones relacionadas