2009-06-08 13 views
5

Mam model, uporządkowana lista, która ma być listą obiektów zawartości uporządkowanych przez użytkownika. The OrderedList ma kilka atrybutów, w tym stronę, do której należy.Walidacja formularza w Admin z formularzem Inline i formularzem modelu

Obiekty treści są do niej dołączane za pośrednictwem klasy OrderedListRow, która jest przenoszona do administratora obiektu OrderedList za pośrednictwem wbudowanego zestawu formularzy w administratorze.

class OrderedList(GenericList): 

    objects = models.Manager() 
    published = GenericListManager() 

class OrderedListRow(models.Model): 

    list = models.ForeignKey(OrderedList) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveSmallIntegerField() 
    content_object = generic.GenericForeignKey("content_type", "object_id") 
    order = models.IntegerField('order', blank = True, null = True) 

(Nazwa OrderedList dziedziczy pole witryny z większego streszczenia w polu Ogólne).

Oto mój problem; kiedy użytkownik zapisuje formularz administracyjny, chcę sprawdzić, czy każdy obiekt zawartości odwzorowany przez każdy obiekt OrderedListRow należy do tej samej lokacji, którą ma uporządkowana lista (lista może należeć tylko do jednej witryny, obiekty treści mogą należeć do wielu).

Mogę zastąpić formularz administratora OrderedList's clean(), ale nie zawiera on wbudowanego formularza, który zawiera obiekty OrderedListRows, więc nie może osiągnąć tych danych. Mogę zastąpić wbudowany zestaw formularzy OrderedListRows w porządku, ale nie może on dotrzeć do listy. Potrzebuję jakiś sposób w kontekście sprawdzania poprawności formularza, aby dotrzeć zarówno do danych formularza uporządkowanej listy, jak i danych formularza formularza, aby można było sprawdzić wszystkie obiekty obiektów uporządkowanych według OrderedListRow względem witryny Listy uporządkowanych i zgłaszać błąd sprawdzania poprawności, jeśli wystąpił problem. . Do tej pory nie znalazłem funkcji, że oczyszczone dane zarówno dla OrderedRow, jak i OrderedListRows są zawarte.

Odpowiedz

5

W formularzu formularzy, self.instance powinien odnosić się do obiektu nadrzędnego, tj. Listy uporządkowanej.

1

Mam do czynienia z tym samym problemem. I niestety nie sądzę, aby powyższa odpowiedź w całości obejmowała sprawy.

Jeśli są zmiany zarówno w formularzu formularzy, jak i formularzu administratora, dostęp do self.instance nie da dokładnych danych, ponieważ będziesz opierał sprawdzanie poprawności w bazie danych, a następnie zapisuje formularz, który nadpisuje dane, których użyłeś do potwierdzaj rzeczy. Zasadniczo to sprawia, że ​​twoja walidacja jest jednym z tyłu.

Przypuszczam, że prawdziwym pytaniem jest to, które zostanie zapisane jako pierwsze. Po wykopaniu kodu źródłowego wygląda na to, że najpierw strona administratora zapisała formularz. Oznacza to, że logicznie, dokonując sprawdzania poprawności w zestawie formularzy i stamtąd uzyskując dostęp do instancji "nadrzędnej" , należy uzyskać spójne wartości w postaci.

+0

W końcu utworzyłem formset dla InderedListRow inline i nadpisałem jego funkcję clean(). W dokumencie udało mi się pobrać identyfikator witryny, podając site_id = self.data.get ("witryna") "Nazwa witryny" to nazwa pola witryny używanego przez nadrzędną listę uporządkowaną. Zasadniczo uzyskuję do niego dostęp bezpośrednio z danych formularza. Po otrzymaniu przesłanego identyfikatora witryny mogłem przetworzyć wszystkie formularze z zestawu OrderedListRow i porównać ich zawartość z witryną OrderedList. – KRH

Powiązane problemy