如何获取表单字段的字段类型

时间:2013-12-23 22:51:20

标签: python django django-forms

我想在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'

我该怎么办?

3 个答案:

答案 0 :(得分:1)

Django使用BoundField类在模板中包装表单字段。要访问正确的字段类,请使用BoundField的field属性。例如:

{{ login_form.username.field }}

访问小部件:

{{ login_form.username.field.widget }}

请注意,您无法在模板中访问字段的类。所有以下划线开头的标识符都无法在模板中访问。

如果您想自定义表单呈现,那么您至少拥有以下选项:

  1. 将选定的widgets分配给表单字段。如果任何Django小部件不提供您想要的功能,那么您需要创建一个自己的小部件(通常是内置小部件的内部小部件)。

  2. 使用不同的HTML模板呈现特定的表单字段。编写所有这些模板需要付出相当多的工作,但通常会付出代价,因为它具有很大的灵活性。

  3. 找一个允许使用#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

¡希望这会有所帮助!