Tworzę aplikację do śledzenia zgłoszeń do pomocy technicznej i mam kilka modeli, które chciałbym utworzyć na jednej stronie. Bilety należą do klienta za pośrednictwem klucza obcego. Notatki należą również do biletów za pośrednictwem klucza obcego. Chciałbym mieć możliwość wyboru Klienta (to jest cały oddzielny projekt) LUB utworzenie nowego Klienta, następnie utworzenie Biletu i na koniec utworzenie Notatki przypisanej do nowego zgłoszenia.
Ponieważ jestem dość nowy w Django, mam tendencję do pracy iteracyjnej, za każdym razem wypróbowując nowe funkcje. Grałem z ModelForms, ale chcę ukryć niektóre pola i przeprowadzić złożoną walidację. Wygląda na to, że poziom kontroli, którego szukam, wymaga zestawów formularzy lub robienia wszystkiego ręcznie, wraz z żmudną, ręcznie kodowaną stroną szablonu, której staram się unikać.
Czy brakuje mi jakiejś uroczej funkcji? Czy ktoś ma dobre referencje lub przykład korzystania z zestawów formularzy? Spędziłem cały weekend nad dokumentacją API dla nich i nadal nie mam pojęcia. Czy to problem projektowy, jeśli zepsuję i ręcznie zakoduję wszystko?
źródło
Odpowiedzi:
To naprawdę nie jest zbyt trudne do zaimplementowania z ModelForms . Powiedzmy, że masz formularze A, B i C. Drukujesz każdy z formularzy i stronę, a teraz musisz obsłużyć POST.
Oto dokumenty do niestandardowej weryfikacji.
źródło
Byłem mniej więcej w tej samej sytuacji dzień temu, a oto moje 2 centy:
1) Znalazłem prawdopodobnie najkrótszą i najbardziej zwięzłą demonstrację wielokrotnego wpisu modelu w pojedynczej formie: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .
W skrócie: stwórz formularz dla każdego modelu, prześlij je do szablonu w jednym
<form>
, używającprefix
keyarg i miej walidację uchwytu widoku. Jeśli istnieje zależność, po prostu upewnij się, że zapisałeś model „nadrzędny” przed zależnością i użyj identyfikatora rodzica dla klucza obcego przed zatwierdzeniem zapisania modelu „potomnego”. Link zawiera demo.2) Być może zestawy formularzy dają się do tego przebić, ale o ile się zagłębiłem, zestawy formularzy służą głównie do wprowadzania wielokrotności tego samego modelu, który można opcjonalnie powiązać z innym modelem / modelami za pomocą obcych kluczy. Wydaje się jednak, że nie ma domyślnej opcji wprowadzania danych więcej niż jednego modelu i wydaje się, że nie do tego służy zestaw form.
źródło
Niedawno miałem problem i właśnie wymyśliłem, jak to zrobić. Zakładając, że masz trzy klasy, Primary, B, C i że B, C mają klucz obcy do podstawowego
Ta metoda powinna umożliwić wykonanie dowolnej weryfikacji wymaganej, a także wygenerowanie wszystkich trzech obiektów na tej samej stronie. Użyłem również javascript i pól ukrytych, aby umożliwić generowanie wielu obiektów B, C na tej samej stronie.
źródło
MultiModelForm ze
django-betterforms
to wygodny wrapper robić to, co jest opisane w odpowiedzi Gnudiff użytkownika . Otacza zwykłe literyModelForm
w jedną klasę, która jest przezroczysta (przynajmniej do podstawowego użytku) używana jako pojedyncza forma. Skopiowałem przykład z ich dokumentów poniżej.źródło
django-betterforms
i jego klasę MultiModelForm, zanim natknąłem się na odpowiedź. Ich rozwiązanie wygląda naprawdę dobrze, ale wygląda na to, że nie było aktualizowane od jakiegoś czasu. Czy nadal używasz tego @jozxyqk? Jakieś problemy?Obecnie mam funkcjonalne obejście problemu (przechodzi moje testy jednostkowe). Moim zdaniem to dobre rozwiązanie, gdy chcesz dodać tylko ograniczoną liczbę pól z innych modeli.
Czy coś mi umyka ?
źródło
„Chcę ukryć niektóre pola i przeprowadzić skomplikowaną weryfikację”.
Zaczynam od wbudowanego interfejsu administratora.
Zbuduj ModelForm, aby wyświetlić żądane pola.
Rozszerz formularz o reguły walidacji w formularzu. Zwykle jest to
clean
metoda.Upewnij się, że ta część działa dość dobrze.
Gdy to zrobisz, możesz odejść od wbudowanego interfejsu administratora.
Następnie możesz wygłupiać się z wieloma, częściowo powiązanymi formularzami na jednej stronie internetowej. To jest zestaw szablonów do prezentacji wszystkich formularzy na jednej stronie.
Następnie musisz napisać funkcję widoku, aby odczytać i zweryfikować różne elementy formularza i wykonać różne obiekty saves ().
„Czy to problem projektowy, jeśli zepsuję i ręcznie zakoduję wszystko?” Nie, to po prostu dużo czasu bez większych korzyści.
źródło
Zgodnie z dokumentacją Django do tego celu służą zestawy formularzy wbudowanych: „Zestawy formularzy wbudowanych to mała warstwa abstrakcji na wierzchu zestawów formularzy modelu. Upraszczają one przypadek pracy z obiektami powiązanymi za pomocą klucza obcego”.
Zobacz https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets
źródło