2013-12-23 45 views
0

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

什么,我能做些什么呢?

+0

我解决表单控件的问题,并增加了一些类所需的字段,但它的硬编码。我想要使​​用更通用的解决方案。 –

回答

1

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

{{ login_form.username.field }} 

要访问控件:

{{ login_form.username.field.widget }} 

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

如果你想定制的形式呈现,那么您至少有下列选项:

  1. 分配选择widgets到表单域。如果任何Django小部件没有提供您想要的功能,那么您需要创建一个自己的小部件(通常是内置小部件的子类)。

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

  3. 查找图书馆,它允许使用来自#2 HTML模板(上djangopackages.com也许)。

+0

感谢您的回复,但除#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 }}

相关问题