2013-12-23 63 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 }}