Django admin在同一行显示多个字段

时间:2011-05-02 00:48:53

标签: python django django-admin

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

现在,我有一个问题,我想在同一行上有两个字段,要做到这一点,我必须在ModelAdmin指定字段集:

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

我是否必须指定所有字段?因为数据库中有许多字段需要指定。

6 个答案:

答案 0 :(得分:22)

将这些字段包装在自己的元组中。

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

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

答案 1 :(得分:2)

我担心没有一种简单的方法可以做到。

一个选项是覆盖该ModelAdmin的change_form.html模板,并根据需要设置表单的样式。

另一个替代方法是自定义ModelForm并使用窗口小部件定义一个字段,该窗口小部件呈现两个输入字段,在窗体的.save()方法中,将窗口小部件结果值(元组)设置为两个字段。

答案 2 :(得分:2)

有一篇文章可能有用

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>

答案 3 :(得分:1)

这很愚蠢,但是,如果您要使用fieldsets元组内的元组方法,则必须指定应在表单上显示的所有字段。

答案 4 :(得分:1)

同意,它令人讨厌,但它的元组元组来自字段列表。 您可以使用列表理解并将列表更改为元组。 这是一个跳过某些字段的例子,你想要特别注意,包括休息正常方式。

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

小调整,这应该有用。

答案 5 :(得分:1)

这对我有用

fieldsets=(        
       ("My Group",{"fields": (tuple(['field1','field1']),),}), 
    )