Ответ 1
Оберните эти поля в их собственный кортеж.
class testAdmin(admin.ModelAdmin): fields = (
'field1',
('field2', 'field3'),
'field4'
)
В приведенном выше примере поля field2
и field3
показаны в одной строке.
Я создал модель, она автоматически отобразит все поля из модели и отобразит ее на странице администратора.
Теперь у меня проблема, я хотел бы иметь два поля в одной строке, для этого мне нужно указать поля в ModelAdmin:
fieldsets = (
(None, {
'fields': (('firstname', 'lastname'),)
}),
)
Нужно ли указывать все поля?. Поскольку в базе данных мне нужно указать несколько полей.
Оберните эти поля в их собственный кортеж.
class testAdmin(admin.ModelAdmin): fields = (
'field1',
('field2', 'field3'),
'field4'
)
В приведенном выше примере поля field2
и field3
показаны в одной строке.
Я боюсь, что это нелегкий способ сделать это.
Один из вариантов заключается в переопределении шаблона change_form.html для этого ModelAdmin и стилизации формы по своему усмотрению.
Другой альтернативой является создание пользовательского ModelForm и определение поля с виджетами, который отображает два поля ввода, в методе формы .save(), задает возвращаемое значение виджета (кортеж) для обоих полей.
Возможно, статья может быть полезной
http://amk1.wordpress.com/2010/09/23/a-2-column-django-admin-form/
Статья цитируется ниже:
Django отлично. Связанный интерфейс администратора делает его лучше. Но по мере увеличения количества элементов в форме количество потерянного пространства увеличивается, потому что макет - это один столбец. В сочетании с выравниванием по левому краю на широкоэкранных мониторах мои пользователи обычно заканчивают свой день условием, которое мы называем "смещением глазных яблок".
Итак, я импровизировал и изменил форму (и StackedInline) на 2-up макет. Больше не "смещение глазных яблок".
Соответствующий шаблон для Django 1.2.1 (/contrib/admin/templates/admin/includes/fieldset.html) выглядит так: измененные строки выделены:
<fieldset class="module aligned {{ fieldset.classes }}"> {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %} {% if fieldset.description %} <div class="description">{{ fieldset.description|safe }}</div> {% endif %} <table border=0 width=100%> {% for line in fieldset %} {% cycle '<tr>' '' %} <td width=50%> <div style="border-bottom:0" class="form-row{% if line.errors %} errors{% endif %}{% for field in line %} {{ field.field.name }}{% endfor %}"> {{ line.errors }} {% for field in line %} <div{% if not line.fields|length_is:"1" %} class="field-box"{% endif %}> {% if field.is_checkbox %} {{ field.field }}{{ field.label_tag }} {% else %} {{ field.label_tag }} {% if field.is_readonly %} <p>{{ field.contents }}</p> {% else %} {{ field.field }} {% endif %} {% endif %} {% if field.field.field.help_text %} <p class="help">{{ field.field.field.help_text|safe }}</p> {% endif %} </div> {% endfor %} </div> </td> {% cycle '' '</tr>' %} {% endfor %} </table> </fieldset>
Это глупо, но да, если вы собираетесь использовать метод fieldsets
tuple-in-a-tuple, вы должны указать все поля, которые должны отображаться в вашей форме.
Согласен, что его раздражает, но его кортеж кортежей из списка полей. вы можете использовать список списка и список изменений для кортежа. Вот пример для пропуска некоторых полей, которые вы хотите обратить особое внимание, в том числе и на обычный путь.
skipped=[]
alist = [field.name for field in <model_name>._meta.fields if field.name not in skipped]
fieldsets = tuple(alist)
*** play with skipped ***
с небольшой настройкой это должно работать.