我想在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 %}
在python控制台中,一切都很好。我的意思是
print field.__class__.__name__
>>> 'DateField'
但我想创建模板标签,结果在这里:
print field.__class__.__name__
>>> 'BoundField'
我该怎么办?
答案 0 :(得分:1)
Django使用BoundField
类在模板中包装表单字段。要访问正确的字段类,请使用BoundField的field
属性。例如:
{{ login_form.username.field }}
访问小部件:
{{ login_form.username.field.widget }}
请注意,您无法在模板中访问字段的类。所有以下划线开头的标识符都无法在模板中访问。
如果您想自定义表单呈现,那么您至少拥有以下选项:
将选定的widgets分配给表单字段。如果任何Django小部件不提供您想要的功能,那么您需要创建一个自己的小部件(通常是内置小部件的内部小部件)。
使用不同的HTML模板呈现特定的表单字段。编写所有这些模板需要付出相当多的工作,但通常会付出代价,因为它具有很大的灵活性。
找一个允许使用#2(可能在djangopackages.com上)的HTML模板的库。
答案 1 :(得分:0)
>>> 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 }}
答案 2 :(得分:0)
C:\Program Files (x86)\heroku\client\bin
¡希望这会有所帮助!