通过Django模板循环

时间:2016-06-15 16:55:02

标签: python django templates

我想更改ModelForm的输入字段的类/属性,但如果可能的话,我想从模板中完成。

以下是我的解决方案,使用django django-widget-tweaks

<form action="" method="POST" enctype="multipart/form-data">
    {% csrf_token %}

    <div class="form-group">
        {{form.title|add_class:"form-control"|attr:"placeholder:Title"|attr:"type:text"}}
    </div>

    <div class="form-group">
        {{form.description|add_class:"form-control"|attr:"placeholder:Description"}}
    </div>

    <div class="form-group">
        {{form.author|add_class:"form-control"|attr:"placeholder:Author"}}
    </div> 

    <div class="form-group">
        <input class="btn btn-primary" type="submit" value="Submit" />
    </div>

</form>

我的问题是,这不是很干,我想知道是否有更好的方法来做到这一点。我知道django已经遍历表单,但我不确定在修改属性时如何集成它。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以将占位符存储在字段help_text field中。有了这个,您就可以轻松地遍历这些字段:

{% for field in form %}
<div class="form-group">
    {{ field|add_class:"form-control"|attr:field.help_text }}
</div>
{% endfor %}

不幸的是,对于第二个参数,很难/不可能使用过滤器,因此您需要将help_text设置为'placeholder:%s',其中%s是您想要的值。

如果您使用的是常规表单,请在构造函数中设置help_text。但是如果您使用的是模型表单,我认为最好创建一个新的模板标记,可以从字段标题中为您创建'placeholder:%s'字符串:

@register.assignment_tag
def get_placeholder_arg(field):
    return 'placeholder:%s' % field.label

然后你的代码看起来像这样:

{% for field in form %}
{% get_placeholder_arg field as arg %}
<div class="form-group">
    {{ field|add_class:"form-control"|attr:arg }}
</div>
{% endfor %}

有关详细信息,请参阅the django documentation on custom template tags