我正在使用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不允许访问表单类型以允许更大的灵活性。
答案 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'