Django имеет тенденцию заполнять горизонтальное пространство при добавлении или редактировании записей в админке, но в некоторых случаях это настоящая трата места, например, при редактировании поля даты шириной 8 символов или CharField, также 6 или 8 шириной символов, а затем поле редактирования увеличивается до 15 или 20 символов.
Как я могу сказать администратору, какой ширины должно быть текстовое поле или высоту поля редактирования TextField?
Ответы:
Вы должны использовать ModelAdmin.formfield_overrides .
Это довольно просто - в
admin.py
, определите:источник
filter_horizontal
илиfilter_vertical
установлено для соответствующих полей в YourModelAdmin. Я потратил некоторое время, чтобы понять это.models.TextField: {'widget': Textarea(attrs={'rows':4})}
но и ширина стала меньше.Вы можете установить произвольные атрибуты HTML для виджета, используя его свойство "attrs" .
Вы можете сделать это в админке Django, используя formfield_for_dbfield:
или с настраиваемым подклассом Widget и словарем formfield_overrides :
источник
Чтобы изменить ширину определенного поля.
Сделано через ModelAdmin.get_form :
источник
Быстрый и грязный вариант - просто предоставить собственный шаблон для рассматриваемой модели.
Если вы создаете шаблон с именем,
admin/<app label>/<class name>/change_form.html
администратор будет использовать этот шаблон вместо шаблона по умолчанию. То есть, если у вас есть модель с именемPerson
в приложении с именемpeople
, вы должны создать шаблон с именемadmin/people/person/change_form.html
.Во всех шаблонах администратора есть
extrahead
блок, который вы можете переопределить, чтобы поместить что-то в него<head>
, и последний кусок головоломки - это тот факт, что каждое поле имеет HTML-идентификаторid_<field-name>
.Итак, вы можете поместить в свой шаблон что-то вроде следующего:
источник
Если вы хотите изменить атрибуты для каждого экземпляра поля, вы можете добавить свойство attrs непосредственно в записи формы.
например:
Свойство "attrs" в основном передает разметку HTML, которая корректирует поле формы. Каждая запись представляет собой кортеж атрибута, который вы хотите переопределить, и значение, которое вы хотите переопределить. Вы можете ввести столько атрибутов, сколько захотите, при условии, что вы разделяете каждый кортеж запятой.
источник
Лучший способ, который я нашел, выглядит примерно так:
Для ModelForm это намного лучше, чем переопределение полей с помощью различных виджетов, поскольку он сохраняет
name
иhelp_text
атрибуты, а также значения по умолчанию для полей модели, поэтому вам не нужно копировать их в свою форму.источник
У меня была аналогичная проблема с TextField. Я использую Django 1.0.2 и хочу изменить значение по умолчанию для «строк» в связанной текстовой области. formfield_overrides не существует в этой версии. Переопределение formfield_for_dbfield сработало, но мне пришлось сделать это для каждого из моих подклассов ModelAdmin, иначе это привело бы к ошибке рекурсии. В конце концов, я обнаружил, что добавление приведенного ниже кода в models.py работает:
Затем используйте MyTextField вместо TextField при определении ваших моделей. Я адаптировал его из этого ответа на аналогичный вопрос.
источник
Это хорошо описано в FAQ по Django :
В: Как мне изменить атрибуты виджета в поле в моей модели?
A: Переопределите поле formfield_for_dbfield в классе ModelAdmin / StackedInline / TabularInline
источник
Вы всегда можете установить размеры полей в настраиваемой таблице стилей и указать Django использовать это для вашего класса ModelAdmin:
источник
для 1.6, используя формы, мне пришлось указать атрибуты текстового поля внутри поля char:
источник
Тот же ответ, что и msdin, но с TextInput вместо TextArea:
источник
Вот простое, но гибкое решение. Используйте настраиваемую форму, чтобы переопределить некоторые виджеты.
Представленные виджеты
ElephantForm
заменят виджеты по умолчанию. Ключ - это строковое представление поля. Поля, не указанные в форме, будут использовать виджет по умолчанию.Обратите внимание, что, хотя
age
это,IntegerField
мы можем использоватьTextInput
виджет, потому что, в отличие отNumberInput
,TextInput
принимаетsize
атрибут.Это решение описано в этой статье .
источник
Если вы работаете с полем ForeignKey, которое включает варианты выбора / параметры / раскрывающееся меню, вы можете переопределить
formfield_for_foreignkey
в экземпляре Admin:Подробнее об этом шаблоне здесь и здесь .
источник
И еще один пример:
Если вы хотите отредактировать только поля определенного размера, вы можете использовать это.
источник