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】:

在您的模板中,您有两个&lt;tr&gt; 元素,每个元素都包含一个对form.visible_fields 的循环,其每次迭代都会生成一个&lt;th&gt;&lt;td&gt;

更改这一轮,以便在form.visible_fields 上有一个循环,其每次迭代都包含一个&lt;tr&gt; 元素,其中包含一个&lt;th&gt; 和一个&lt;td&gt;。像这样:

<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

Django 表单向导 - 每个步骤的自定义表单布局

以自定义表单呈现模板中的各个字段

模板中的自定义表单验证错误

如何将 Django 的内置身份验证与自定义表单(html 模板)一起使用

具有过滤查询集的组权限的自定义表单