Django ma tendencję do zapełniania poziomej przestrzeni podczas dodawania lub edytowania wpisów w panelu administracyjnym, ale w niektórych przypadkach jest to prawdziwa strata miejsca, gdy np. Edytowanie pola daty o szerokości 8 znaków lub CharField również 6 lub 8 znaków szerokich, a następnie pole edycji rozszerza się do 15 lub 20 znaków.
Jak mogę powiedzieć administratorowi, jak szerokie powinno być pole tekstowe lub jak wysokość pola edycji TextField?
Odpowiedzi:
Powinieneś użyć ModelAdmin.formfield_overrides .
To całkiem proste -
admin.py
zdefiniuj:źródło
filter_horizontal
lubfilter_vertical
jest ustawione dla odpowiednich pól w YourModelAdmin. Spędziłem trochę czasu, żeby to rozgryźć.models.TextField: {'widget': Textarea(attrs={'rows':4})}
ale szerokość też się zmniejszyła.Możesz ustawić dowolne atrybuty HTML widżetu za pomocą jego właściwości „attrs” .
Możesz to zrobić w panelu administracyjnym Django za pomocą formfield_for_dbfield:
lub z niestandardową podklasą Widget i słownikiem formfield_overrides :
źródło
Aby zmienić szerokość określonego pola.
Wykonane przez ModelAdmin.get_form :
źródło
Szybką i nieprzyjemną opcją jest po prostu zapewnienie niestandardowego szablonu dla danego modelu.
Jeśli utworzysz szablon o nazwie,
admin/<app label>/<class name>/change_form.html
administrator użyje tego szablonu zamiast domyślnego. Oznacza to, że jeśli masz model o nazwiePerson
w aplikacji o nazwiepeople
, możesz utworzyć szablon o nazwieadmin/people/person/change_form.html
.Wszystkie szablony administracyjne mają
extrahead
blok, który możesz nadpisać, aby umieścić rzeczy w<head>
, a ostatnim elementem układanki jest fakt, że każde pole ma identyfikator HTMLid_<field-name>
.Możesz więc umieścić w swoim szablonie coś takiego:
źródło
Jeśli chcesz zmienić atrybuty instancji dla poszczególnych pól, możesz dodać właściwość „attrs” bezpośrednio do wpisów formularza.
na przykład:
Właściwość „attrs” zasadniczo przekazuje kod HTML, który dostosuje pole formularza. Każdy wpis jest krotką atrybutu, który chcesz przesłonić, oraz wartością, którą chcesz zastąpić. Możesz wprowadzić dowolną liczbę atrybutów, pod warunkiem, że oddzielisz każdą krotkę przecinkiem.
źródło
Najlepszy sposób, jaki znalazłem, to coś takiego:
Jest o wiele lepiej niż na ModelForm przesłanianie pól z różnych widgetów, jak zachowuje
name
ihelp_text
atrybuty, a także domyślne wartości pól modelu, więc nie trzeba je skopiować do formularza.źródło
Miałem podobny problem z TextField. Używam Django 1.0.2 i chciałem zmienić domyślną wartość dla „wierszy” w powiązanym obszarze tekstowym. formfield_overrides nie istnieje w tej wersji. Zastępowanie formfield_for_dbfield działało, ale musiałem to zrobić dla każdej z moich podklas ModelAdmin lub spowodowałoby to błąd rekursji. Ostatecznie stwierdziłem, że dodanie poniższego kodu do models.py działa:
Następnie podczas definiowania modeli użyj MyTextField zamiast TextField. Zaadaptowałem to na podstawie tej odpowiedzi do podobnego pytania.
źródło
Jest to dobrze opisane w Django FAQ :
P: Jak zmienić atrybuty widgetu w polu w moim modelu?
Odp .: Zastąp formfield_for_dbfield w klasie ModelAdmin / StackedInline / TabularInline
źródło
Zawsze możesz ustawić rozmiary pól w niestandardowym arkuszu stylów i powiedzieć Django, aby użył tego dla Twojej klasy ModelAdmin:
źródło
dla wersji 1.6, używając formularzy musiałem określić atrybuty obszaru tekstowego wewnątrz pola charfield:
źródło
Taka sama odpowiedź jak msdin, ale z TextInput zamiast TextArea:
źródło
Oto proste, ale elastyczne rozwiązanie. Użyj niestandardowego formularza, aby zastąpić niektóre widżety.
Widgety podane w
ElephantForm
zastąpią domyślne. Klucz to ciąg znaków reprezentujący pole. Pola niewyszczególnione w formularzu będą używały domyślnego widżetu.Zauważ, że chociaż
age
jest to widżet,IntegerField
możemy użyćTextInput
widżetu, ponieważ w przeciwieństwie doNumberInput
,TextInput
akceptujesize
atrybut.To rozwiązanie jest opisane w tym artykule .
źródło
Jeśli pracujesz z polem ForeignKey, które obejmuje opcje / opcje / menu rozwijane, możesz nadpisać
formfield_for_foreignkey
w instancji administratora:Więcej informacji na temat tego wzoru tutaj i tutaj .
źródło
I jeszcze jeden przykład:
Jeśli chcesz edytować tylko określony rozmiar pól, możesz tego użyć.
źródło