Подтвердить что ты не робот

Django admin отображает несколько полей на одной строке

Я создал модель, она автоматически отобразит все поля из модели и отобразит ее на странице администратора.

Теперь у меня проблема, я хотел бы иметь два поля в одной строке, для этого мне нужно указать поля в ModelAdmin:

fieldsets = (
        (None, {
            'fields': (('firstname', 'lastname'),)
        }),
       )

Нужно ли указывать все поля?. Поскольку в базе данных мне нужно указать несколько полей.

4b9b3361

Ответ 1

Оберните эти поля в их собственный кортеж.

class testAdmin(admin.ModelAdmin): fields = (
     'field1',
     ('field2', 'field3'),
     'field4'
)

В приведенном выше примере поля field2 и field3 показаны в одной строке.

Ответ 2

Я боюсь, что это нелегкий способ сделать это.

Один из вариантов заключается в переопределении шаблона change_form.html для этого ModelAdmin и стилизации формы по своему усмотрению.

Другой альтернативой является создание пользовательского ModelForm и определение поля с виджетами, который отображает два поля ввода, в методе формы .save(), задает возвращаемое значение виджета (кортеж) для обоих полей.

Ответ 3

Возможно, статья может быть полезной

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>

Ответ 4

Это глупо, но да, если вы собираетесь использовать метод fieldsets tuple-in-a-tuple, вы должны указать все поля, которые должны отображаться в вашей форме.

Ответ 5

Согласен, что его раздражает, но его кортеж кортежей из списка полей. вы можете использовать список списка и список изменений для кортежа. Вот пример для пропуска некоторых полей, которые вы хотите обратить особое внимание, в том числе и на обычный путь.

skipped=[]
alist = [field.name for field in <model_name>._meta.fields if field.name not in skipped]
fieldsets = tuple(alist)
*** play with skipped ***

с небольшой настройкой это должно работать.