Django后台在同一行显示多个字段

22 投票
6 回答
21318 浏览
提问于 2025-04-16 16:47

我创建了一个模型,它会自动显示模型中的所有字段,并在管理页面上展示出来。

现在,我遇到了一个问题,我想把两个字段放在同一行。为此,我需要在ModelAdmin中指定字段集:

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

我需要指定所有字段吗?因为数据库里有很多字段,我需要一个个指定。

6 个回答

2

这篇文章可能对你有帮助。

http://amk1.wordpress.com/2010/09/23/a-2-column-django-admin-form/

文章内容如下:


Django真不错。它自带的管理界面让它更好用。但是,当表单上的项目越来越多时,空间的浪费也会增加,因为布局是单列的。在宽屏显示器上左对齐的情况下,我的用户常常会感到一种我们称之为“眼球错位”的情况。

所以我临时想了个办法,把表单(和StackedInline)改成了两列布局。这样就没有“眼球错位”的问题了。

对应于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>
2

我怕这事没那么简单。

一种方法是覆盖那个 ModelAdmin 的 change_form.html 模板,然后按照你喜欢的样子来设计表单。

另一种选择是自定义一个 ModelForm,定义一个字段,使用一个可以显示两个输入框的控件。在表单的 .save() 方法里,把这个控件得到的值(一个元组)设置到两个字段上。

45

把那些字段放在一个单独的元组里。

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

在上面的例子中,字段 field2field3 是在同一行显示的。

撰写回答