2013-12-23 2 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. Поиск библиотеки, которая позволяет использовать HTML-шаблоны от # 2 (возможно, на 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 }}

Смежные вопросы