获取django模板中的字段类型

Posted

技术标签:

【中文标题】获取django模板中的字段类型【英文标题】:Get the type of field in django template 【发布时间】:2015-10-12 16:59:39 【问题描述】:

我正在使用 django 表单,我想在我的 html 中使用 Twitter Bootstrap 的 css。 所以我的模板看起来像这样:

% for field in form %
    <div class="form-group">
         field.label_tag <!--Same thing as : <label for="field.id_for_label"></label> -->

        <input type="field.type" class="form-control" id="field.auto_id" placeholder="Email">
      </div>
% endfor %

我无法弄清楚获取类型值。 field.type

有没有办法获取django模板中输入字段的类型?

提前致谢

更新: 我问这个问题的原因是因为我希望能够将引导类应用于输入元素。但在 Bootstrap3 中,要使用默认 css 作为输入类型,您必须向输入元素添加表单控制类,如下所示:&lt;input type="text" class="form-control" id="field.auto_id" placeholder=""&gt;.

如果我使用 django 的字段 field 那么我无法添加表单控制类。 我希望这能澄清一些事情。

我还看到了这个应用程序https://github.com/dyve/django-bootstrap3,它看起来就像我想做的那样。令我惊讶的是,django 不允许访问表单类型以提供更大的灵活性。

【问题讨论】:

通常,您只需执行以下操作:&lt;div class="form-group"&gt; field &lt;/div&gt; 该类型将由 Django 自动填写。您是否需要该类型用于其他目的? @AnthonyHilyard 是的。但在 Bootstrap3 中,要将默认 css 用于输入类型,您必须将表单控制类添加到输入元素,如下所示:&lt;input type="text" class="form-control" id="field.auto_id" placeholder=""&gt; 我真正想做的是在模板本身中应用表单控制类。 Get type of Django form widget from within template的可能重复 【参考方案1】:

根据https://***.com/a/31538555/254553

你可以使用:

 [FIELD].field.widget.input_type 

[FIELD] 是您的字段名称。

【讨论】:

这应该是一个可以接受的答案!【参考方案2】:

您可以覆盖表单的__init__ 方法,以便将属性传递给HTML,而无需知道字段的类型。适用于标准表单和模型表单

class CoolForm(forms.Form):
    field_name = forms.CharField(...)

    def __init__(self, *args, **kwargs):
        super(CoolForm, self).__init__(*args, **kwargs)
        self.fields['field_name'].widget.attrs = 
            'class': 'form-control'
        

您可以通过这种方式将任何 HTML 属性传递给模板,例如 'placeholder': 'email@exam.pl'

【讨论】:

【参考方案3】:

我也有这个问题。我使用 Django Widget Tweaks 添加类 (https://github.com/kmike/django-widget-tweaks)。

然后你可以这样做:

    % for field in form %
     <div class="form-group % if field.errors %has-error % endif %">    
        % render_field field class="form-control" %
        % if field.errors %
        <span class="help-block"> field.errors.0 </span>
        % endif %
    </div>
   % endfor %

我认为另一种处理方法是使用 django 脆形式,但我还没有尝试过。

【讨论】:

【参考方案4】:

我认为您不必担心field_type。 Django 将根据表单字段自行为您处理。

假设我们有一个ContactForm 喜欢:

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

那么form.subject会自动在模板中创建&lt;input&gt;元素。

<input id="id_subject" type="text" name="subject" maxlength="100" />

同样,模板中的form.message 会创建:

<input type="text" name="message" id="id_message" />

虽然如果你真的需要在模板中获取表单字段类型,你可以创建一个自定义模板过滤器,如下所示。

from django import template

register = template.Library()

@register.filter(name='field_type')
def field_type(field):
    return field.field.widget.__class__.__name__

现在,在您的模板中,您需要执行以下操作:

form.field_name|field_type

在上面的例子中,form.message|field_type 将返回TextInput

【讨论】:

真的!不过,我希望输入元素具有更大的灵活性。主要是为了能够在模板本身中使用引导类。 使用自定义模板过滤器更新了 ans,该过滤器将返回 field_type。【参考方案5】:

如果您想访问字段类型,请参考this answer。 如果要覆盖字段的默认类型,请在为字段定义小部件时使用attrs 参数。 例如。

field_name = forms.CharField(widget=forms.Textarea(attrs='type': 'custom type'))

另外请注意,您可以将任何键值对传递给attrs,它们将在呈现表单时用作html标签中的属性。

【讨论】:

以上是关于获取django模板中的字段类型的主要内容,如果未能解决你的问题,请参考以下文章

模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏

django模型,如何动态设置查询的字段?

如何检查 django 表单中的字段类型?

Wordpress ACF 字段如何从自定义帖子类型中获取选项

仅从模板中的 django 表单中获取一个字段

基于选择的 Django 模板/ChoiceField 显示字段