Django 中的自定义表单集模板
Posted
技术标签:
【中文标题】Django 中的自定义表单集模板【英文标题】:Custom formset templates in Django 【发布时间】:2013-03-28 18:32:12 【问题描述】:我正在为这个模型使用 Django formset:
class Book(models.Model):
book_id=models.AutoField(primary_key=True,unique=True)
book_name=models.CharField(max_length=30)
publisher_name=models.CharField(max_length=40)
author=models.ForeignKey(Author)
formset 是这样定义的:
BookFormset = inlineformset_factory(Author, Book,
fields=('book_id','book_name', 'publisher_name'), extra=1,
can_delete=False)
模板是:
formset.non_form_errors.as_ul
<table id="formset" class="form">
% for form in formset.forms %
% if forloop.first %
<thead><tr>
% for field in form.visible_fields %
<th> field.label|capfirst
% endfor %
</tr></thead>
% endif %
<tr class="% cycle row1,row2 %">
% for field in form.visible_fields %
<td>
# Include the hidden fields in the form #
% if forloop.first %
% for hidden in form.hidden_fields %
hidden
% endfor %
% endif %
field.errors.as_ul
field
</td>
% endfor %
</tr>
% endfor %
</table>
这些字段按列显示,但我希望它们按行显示。
上面的代码产生如下输出:
Book name Publisher name
book_field Publisher_field
我希望输出如下所示:
Book name book_field
Publisher name Publisher_field
我该怎么做?
【问题讨论】:
【参考方案1】:在您的模板中,您有两个<tr>
元素,每个元素都包含一个对form.visible_fields
的循环,其每次迭代都会生成一个<th>
或<td>
。
更改这一轮,以便在form.visible_fields
上有一个循环,其每次迭代都包含一个<tr>
元素,其中包含一个<th>
和一个<td>
。像这样:
<table id="formset" class="form">
% for form in formset.forms %
% for field in form.visible_fields %
<tr class="% cycle row1,row2 %">
<th> field.label|capfirst </th>
<td>
# Include the hidden fields in the form #
% if forloop.first %
% for hidden in form.hidden_fields %
hidden
% endfor %
% endif %
field.errors.as_ul
field
</td>
</tr>
% endfor %
% endfor %
</table>
【讨论】:
你是对的,字段名称是粗体,如何更改为正常的 在样式表中添加一条规则 (font-weight:normal
)。或者使用td
而不是th
。【参考方案2】:
上面的示例似乎显示了按列布局,这似乎是表单集呈现自身时的默认布局。
要使其按行排列,请使用以下内容:
<table>
% for form in formset.forms %
% if forloop.first %
<thead>
% for field in form.visible_fields %
<th> field.label </th>
% endfor %
</thead>
<tbody>
% endif %
<tr class="% cycle row1,row2 %">
% for field in form.visible_fields %
<td>
% if forloop.first %
% for hidden in form.hidden_fields %
hidden
% endfor %
% endif %
field.errors.as_ul
field
</td>
% endfor %
</tr>
% if forloop.last %
</tbody>
% endif %
% endfor %
</table>
【讨论】:
以上是关于Django 中的自定义表单集模板的主要内容,如果未能解决你的问题,请参考以下文章
django 表单向导中的自定义模板 - NameError