获取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 作为输入类型,您必须向输入元素添加表单控制类,如下所示:<input type="text" class="form-control" id="field.auto_id" placeholder="">.
如果我使用 django 的字段 field
那么我无法添加表单控制类。
我希望这能澄清一些事情。
我还看到了这个应用程序https://github.com/dyve/django-bootstrap3,它看起来就像我想做的那样。令我惊讶的是,django 不允许访问表单类型以提供更大的灵活性。
【问题讨论】:
通常,您只需执行以下操作:<div class="form-group"> field </div>
该类型将由 Django 自动填写。您是否需要该类型用于其他目的?
@AnthonyHilyard 是的。但在 Bootstrap3 中,要将默认 css 用于输入类型,您必须将表单控制类添加到输入元素,如下所示:<input type="text" class="form-control" id="field.auto_id" placeholder="">
我真正想做的是在模板本身中应用表单控制类。
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
会自动在模板中创建<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
。
【讨论】:
真的!不过,我希望输入元素具有更大的灵活性。主要是为了能够在模板本身中使用引导类。 使用自定义模板过滤器更新了 ans,该过滤器将返回 field_type。【参考方案5】:如果您想访问字段类型,请参考this answer。
如果要覆盖字段的默认类型,请在为字段定义小部件时使用attrs
参数。
例如。
field_name = forms.CharField(widget=forms.Textarea(attrs='type': 'custom type'))
另外请注意,您可以将任何键值对传递给attrs
,它们将在呈现表单时用作html标签中的属性。
【讨论】:
以上是关于获取django模板中的字段类型的主要内容,如果未能解决你的问题,请参考以下文章
模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏