Django后台在同一行显示多个字段
我创建了一个模型,它会自动显示模型中的所有字段,并在管理页面上展示出来。
现在,我遇到了一个问题,我想把两个字段放在同一行。为此,我需要在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'
)
在上面的例子中,字段 field2
和 field3
是在同一行显示的。