我创建了一个模型,它会自动显示模型中的所有字段并将其显示在管理页面上。
现在,我有一个问题,我想在同一行上有两个字段,要做到这一点,我必须在ModelAdmin指定字段集:
fieldsets = (
(None, {
'fields': (('firstname', 'lastname'),)
}),
)
我是否必须指定所有字段?因为数据库中有许多字段需要指定。
答案 0 :(得分:22)
将这些字段包装在自己的元组中。
class testAdmin(admin.ModelAdmin): fields = (
'field1',
('field2', 'field3'),
'field4'
)
在上面的示例中,字段field2
和field3
显示在一行中。
答案 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']),),}),
)