获取django模板中的字段类型

时间:2015-07-22 17:01:42

标签: django django-forms

我正在使用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模板中获取输入字段的类型?

提前致谢

更新 我问这个问题的原因是因为我希望能够将bootstrap类应用于input元素。但是在Bootstrap3中,要使用默认的css作为输入类型,你必须将form-control类添加到输入元素,如下所示:<input type="text" class="form-control" id="{{field.auto_id}}" placeholder="">.

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

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

4 个答案:

答案 0 :(得分:10)

我认为您不必担心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}}会自动在模板中创建<input>元素。

<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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

我也有这个问题。我使用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 crispy form但我还没有尝试过。

答案 3 :(得分:0)

您可以覆盖表单的__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'