如何获取表单字段的字段类型
问题描述:
我想在Django的ModelForm中获取字段的模型类型或表单类型。如何获取表单字段的字段类型
models.py
class Offer(models.Model):
title = models.CharField(max_length=255)
start_date = models.DateField()
forms.py
class OfferForm(forms.ModelForm):
class Meta:
model = Offer
add_offer.html
{% for form in offer_form %}
{% if form.field_type??? = 'DateField' %}
{# add some class or something ??? #}
{% endif %}
{% endfor %}
在蟒蛇控制台一切都还不错。我的意思是
print field.__class__.__name__
>>> 'DateField'
,但我想创建模板标签和结果在这里:
print field.__class__.__name__
>>> 'BoundField'
什么,我能做些什么呢?
答
Django的包装与BoundField
类模板表单字段。要访问正确的字段类,请使用BoundField的field
属性。例如:
{{ login_form.username.field }}
要访问控件:
{{ login_form.username.field.widget }}
请注意,您将无法访问模板字段的类。模板中无法访问以下划线开头的所有标识符。
如果你想定制的形式呈现,那么您至少有下列选项:
分配选择widgets到表单域。如果任何Django小部件没有提供您想要的功能,那么您需要创建一个自己的小部件(通常是内置小部件的子类)。
使用不同的HTML模板来呈现特定的表单字段。编写所有这些模板相当多,但通常会付出代价,因为它提供了很大的灵活性。
查找图书馆,它允许使用来自#2 HTML模板(上djangopackages.com也许)。
+0
感谢您的回复,但除#1之外的每个解决方案都需要大量工作。我现在只用硬编码的小部件。 –
答
>>> f.formfield().widget
<django.forms.widgets.TextInput object at 0x1125fc690>
>>> f.formfield().widget
<django.forms.widgets.TextInput object at 0x1125fc710>
>>> dir(f.formfield().widget)
['__class__', '__deepcopy__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_format_value', 'attrs', 'build_attrs', 'id_for_label', 'input_type', 'is_hidden', 'is_localized', 'is_required', 'media', 'needs_multipart_form', 'render', 'subwidgets', 'value_from_datadict']
>>> f.formfield().widget.attrs
{u'maxlength': '10'}
>>> f.formfield().widget.input_type
u'text'
>>>
,所以我认为你可以使用{{ login_form.username.field.widget.input_type }}
我解决表单控件的问题,并增加了一些类所需的字段,但它的硬编码。我想要使用更通用的解决方案。 –