2011-01-19 7 views
11

Przebaczcie mi, jeśli wcześniej udzielono na to odpowiedzi, nie mogłem znaleźć odpowiedzi, w przypadku której walidacja zależała od łącznej liczby formularzy śródliniowych.Weryfikacja przez administratora Django dla formularza liniowego, który polega na sumie pola między wszystkimi formularzami

Trochę tła: Robię miejsce na brokera ubezpieczeniowego, który ma „Polityki” i "Razem Komisji tej polityki. Są też które są dodawane do „Polityki” wraz z Komisją, która udaje się do nich „Sprzedawcy” (może mieć dowolną liczbę sprzedawców). Łączna prowizja między sprzedawców musi być mniejsza niż całkowita prowizji.

Mam model admin.ModelForm, a poniżej mam admin.InlineTabular, który może mieć wielu sprzedawców za pomocą przycisku "Dodaj" i wszystko działa idealnie.

Jednak nie mogę wymyślić, jak wykonać sprawdzanie poprawności na nich, tak, że mogę zasadniczo zsumować wszystkie prowizje, a następnie, jeśli jest większa niż całkowita prowizja, rzucić błąd sprawdzania poprawności.

Próbowałem czysty(), ale nie wiem, jak uzyskać dostęp do InlineTabular czyszczone danych, jeśli jest jeszcze dostępna!

Z góry dziękuję za pomoc!

Thomas

+0

Podobne pytanie: http: // stackoverflow .com/pytania/877723/inline-form-validation-in-django – utapyngo

Odpowiedz

19

Wiem, że pytano dawno temu, ale ponieważ miałem problemy z tym samym problemem, myślę, że może to być przydatne.

Kluczem jest tutaj zdefiniowanie niestandardowego zestawu formularzy do osadzenia w formularzu administracyjnym w formie tabelarycznej, a następnie zastąpienie metody formset-clean.

Oto przykład: kompozycja wykonana jest z composition_elements każdy composition_element ma pole procent, a chcę, aby potwierdzić, że całkowity procent jest równy 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

To zajęło mi wieki, aby znaleźć, ale wiedziałem, że musi być w prosty sposób. Dzięki. – Cerin

+0

Według tej odpowiedzi [] (http://stackoverflow.com/a/14031135/25507), należy sprawdzić 'form.cleaned_data [ 'usunięte']' jak 'nie form.cleaned_data'. –

Powiązane problemy