一尘不染

从模板中获取Django表单小部件的类型

django

我正在遍历表单的字段,对于某些字段,我希望布局略有不同,需要更改HTML。

为了准确地做到这一点,我只需要知道小部件类型。它的类名或类似名称。在标准python中,这很容易!field.field.widget.__class__.__name__

不幸的是,你不允许访问模板中的下划线变量。大!

你可以进行测试,field.field.widget.input_type但这仅适用于文本/密码<input ../>类型。我需要更多的分辨率。

对我而言,无论看起来多么困难,在模板级别执行此操作都是最有意义的。我已经将处理字段的HTML的部分代码外包给了包含在字段循环中的单独模板。这意味着它在ModelForms和standard上是一致Form的(如果我写了一个中间Form类,那是不对的)。


阅读 435

收藏
2020-03-30

共2个答案

一尘不染

从Django 1.11开始,你可以使用widget.input_type。例:

{% for field in form.visible_fields %}
    <input type="{{ field.field.widget.input_type }}"
           id="{{ field.id_for_label }}"
           name="{{ field.html_name }}"
           placeholder="{{ field.label }}"
           maxlength="{{ field.field.max_length }}" />
{% endfor %}
2020-03-30
一尘不染

制作模板标签可能行得通吗?就像是field.field.widget|widget_type

来自Oli的编辑:好点!我刚刚写了一个过滤器:

from django import template
register = template.Library()

@register.filter('klass')
def klass(ob):
    return ob.__class__.__name__

现在可以{{ object|klass }}正确渲染。现在,我只想弄清楚如何在模板的if语句中使用它。

从Oli#2进行编辑:我需要在if陈述模板中使用该结果,因此我只是将所有逻辑转移到了templatetag中。魔法。感谢你向正确的方向戳我。

2020-03-30