2011-01-19 6 views
11

Perdonami se è già stata data una risposta, non sono riuscito a trovare una risposta in cui la convalida dipendesse dall'aggregato di moduli in linea.Convalida dell'amministratore di Django per modulo in linea che si basa sul totale di un campo tra tutte le forme

Poco background: sto facendo un sito per un broker assicurativo che ha "Politiche" e una "Commissione totale" di tale politica. Ci sono anche "Rivenditori" che vengono aggiunti alla "Politica" insieme a una commissione che va a loro (può avere un numero qualsiasi di rivenditori). La commissione totale tra i rivenditori deve essere inferiore alla commissione totale.

Ho un admin.ModelForm per un criterio, e di seguito ho un admin.InlineTabular che può avere più rivenditori attraverso il pulsante 'Aggiungi' e tutto funziona perfettamente.

Tuttavia, non riesco a capire come eseguire la convalida su di essi, in modo da poter sommare praticamente tutte le commissioni e quindi se è maggiore della commissione totale lanciare un errore di convalida.

Ho provato clean() ma non so come accedere ai dati puliti di InlineTabular se sono addirittura disponibili!

Grazie in anticipo per qualsiasi aiuto!

Thomas

+0

domanda simile: http: // StackOverflow .com/questions/877723/inline-form-validation-in-django – utapyngo

risposta

19

so che la questione è stato chiesto molto tempo fa, ma da quando ho lottato con lo stesso problema, penso che potrebbe essere utile.

La chiave qui è definire un formset personalizzato da incorporare nel modulo di amministrazione tabulare, quindi sovrascrivere il metodo di formset clean.

Ecco un esempio: una composizione è fatta di composition_elements, ogni composition_element ha un campo per cento, e voglio confermare che la percentuale totale è pari 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

Questo mi ha portato per sempre a trovarlo, ma sapevo che doveva esserci un modo semplice. Grazie. – Cerin

+0

Secondo [questa risposta] (http://stackoverflow.com/a/14031135/25507), dovresti controllare 'form.cleaned_data ['DELETED']' così come 'not form.cleaned_data'. –

Problemi correlati