Mam model zarejestrowany w serwisie administratora. Jedno z jego pól to długie wyrażenie łańcuchowe. Chciałbym dodać niestandardowe pola formularzy do strony dodawania / aktualizowania tego modelu w administratorze, który na podstawie wartości tych pól zbuduję długie wyrażenie i zapiszę je w odpowiednim polu modelu.
Jak mogę to zrobić?
AKTUALIZACJA: Zasadniczo to, co robię, to budowanie wyrażenia matematycznego lub tekstowego z symboli, użytkownik wybiera symbole (są to niestandardowe pola, które nie są częścią modelu), a kiedy kliknie przycisk Zapisz, tworzę reprezentację wyrażenia łańcuchowego z listę symboli i zapisz ją w DB. Nie chcę, aby symbole były częścią modelu i DB, tylko ostatecznym wyrażeniem.
fields = '__all__'
do swojejMeta
klasy, w przeciwnym razie django narzeka:Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated
YourModelAdmin.list_display[0], 'extra_field' is not a callable or an attribute of 'YourModelAdmin' or found in the model 'YourModel'.
AttributeError: Unable to lookup "extra_field"...
znak, spróbuj dodać alabel
doextra_field
definicji. Wydaje się, że Django stara się „odgadnąć” etykietę na to, by patrząc naModel
iModelAdmin
dla takiej definicji atrybutu.Unknown field(s) (extra_field) specified for YourModel. Check fields/fieldsets/exclude attributes of class YourModelAdmin.
. Sposób obejścia tego problemu toextra_field = forms.CharField(widget=forms.HiddenInput())
Można to zrobić w adminie, ale nie ma do tego prostego sposobu. Chciałbym również poradzić, aby zachować większość logiki biznesowej w modelach, abyś nie był zależny od Django Admin.
Może byłoby łatwiej (a może nawet lepiej), gdybyś miał dwa oddzielne pola w swoim modelu. Następnie dodaj do modelu metodę, która je łączy.
Na przykład:
Następnie w panelu administracyjnym możesz dodać
combined_fields()
pole tylko do odczytu:Jeśli chcesz przechowywać
combined_fields
w bazie danych, możesz również zapisać go podczas zapisywania modelu:źródło
save()
metodą modelu , sprawdź aktualizacje mojej odpowiedzi.Django 2.1.1 Główna odpowiedź pozwoliła mi odpowiedzieć na moje pytanie. Nie pomogło mi to zapisać wyniku w polu w moim rzeczywistym modelu. W moim przypadku chciałem mieć pole tekstowe, do którego użytkownik mógłby wprowadzić dane, a następnie, gdy nastąpi zapis, dane zostaną przetworzone, a wynik zostanie umieszczony w polu w modelu i zapisany. Chociaż pierwotna odpowiedź pokazała, jak uzyskać wartość z dodatkowego pola, nie pokazała, jak zapisać ją z powrotem do modelu, przynajmniej w Django 2.1.1
Pobiera wartość z niezwiązanego pola niestandardowego, przetwarza i zapisuje ją w moim prawdziwym polu opisu:
źródło
zawsze możesz utworzyć nowy szablon administratora i robić to, czego potrzebujesz w swoim admin_view (nadpisz adres administratora dodając adres URL do swojego admin_view):
źródło
Jeśli absolutnie chcesz przechowywać tylko połączone pole w modelu, a nie dwa oddzielne pola, możesz zrobić coś takiego:
form
atrybutu na swoimModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form )save_formset
metodzie wModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model )Nigdy czegoś takiego nie robiłem, więc nie jestem do końca pewien, jak to się skończy.
źródło