2011-01-19 5 views
11

Perdóneme si esto ha sido respondido antes, no pude encontrar una respuesta donde la validación dependía del agregado de formularios en línea.validación de administrador de Django para formulario en línea que se basa en el total de un campo entre todas las formas

Poco de fondo: estoy haciendo un sitio para un corredor de seguros que tiene 'Políticas' y una 'Comisión total' de esa política. También hay 'Revendedores' que se agregan a la 'Política' junto con una comisión que va a ellos (puede tener cualquier número de revendedores). La comisión total entre los revendedores debe ser menor que la comisión total.

Tengo un admin.ModelForm para una política, y abajo tengo un admin.InlineTabular que puede tener múltiples revendedores a través del botón 'Agregar' y todo esto funciona perfectamente.

Sin embargo, parece que no entiendo cómo hacer la validación en ellos, por lo que básicamente puedo agregar todas las comisiones y luego, si es mayor que la comisión total lanzar un ValidationError.

He intentado limpiar() pero no sé cómo acceder a los datos limpios de InlineTabular si está disponible.

¡Gracias de antemano por cualquier ayuda!

Thomas

+0

Pregunta similar: http: // stackoverflow .com/questions/877723/inline-form-validation-in-django – utapyngo

Respuesta

19

sé la pregunta fue hecha hace mucho tiempo, pero ya que tuve problemas con el mismo problema, creo que podría ser muy útil.

La clave aquí es definir un formset personalizado para incrustar en el formulario tabular de administración, y luego anular el método de formset clean.

He aquí un ejemplo: se prepara una composición de composition_elements, cada uno tiene un campo composition_element ciento, y quiero validar que el porcentaje total es igual a 100.

from django import forms 
from django.forms.models import BaseInlineFormSet 
from django.core.exceptions import ValidationError 
from django.utils.translation import ugettext_lazy as _ 
from django.contrib import admin 
from .models import Composition, CompositionElement 

class CompositionElementFormSet(BaseInlineFormSet): 
    ''' 
    Validate formset data here 
    ''' 
    def clean(self): 
     super(CompositionElementFormSet, self).clean() 

     percent = 0 
     for form in self.forms: 
      if not hasattr(form, 'cleaned_data'): 
       continue 
      data = form.cleaned_data 
      percent += data.get('percent', 0) 

     if percent != 100: 
      raise ValidationError(_('Total of elements must be 100%%. Current : %(percent).2f%%') % {'percent': percent}) 

class CompositionElementAdmin(admin.TabularInline): 
    model = CompositionElement 
    formset = CompositionElementFormSet 

class CompositionAdmin(admin.ModelAdmin): 
    inlines = (CompositionElementAdmin,) 

admin.site.register(Composition, CompositionAdmin) 
+0

Esto me llevó mucho tiempo encontrarlo, pero sabía que tenía que haber una manera simple. Gracias. – Cerin

+0

Según [esta respuesta] (http://stackoverflow.com/a/14031135/25507), debe marcar 'form.cleaned_data ['DELETED']' así como 'not form.cleaned_data'. –

Cuestiones relacionadas