2015-01-07 2 views
0

Почему, когда я пишуДжанго поля формы не оказывая при использовании пользовательского GetAttr templatetag

{% with "answer_1" as ans %} 
    {{ form|getattr:ans }} 
{% endwith %} 

Я получаю

<django.forms.fields.CharField object at 0x7fdea0f0a210> 

в моем шаблоне, но когда я пишу

{{ form.answer_1 }} 

Я получаю правильно обработанное текстовое поле?

Моего GetAttribute templatetag выглядит следующим образом:

@register.filter(name='getattr') 
def getattribute(value, arg): 
    if hasattr(value, arg): 
     return getattr(value, arg) 
    elif hasattr(value, 'has_key') and arg in value: 
     return value[arg] 
    else: 
     return settings.TEMPLATE_STRING_IF_INVALID 

Это очень важно для меня, чтобы быть в состоянии оказывать текстовые поля с помощью {% with %} тега, так как моя форма содержит много ответов, и я хочу перебирать их и отобразить текстовое поле для каждого.

Любая помощь будет радушна. Заранее спасибо!

+0

Проблема, вероятно, связана с вашим фильтром getattr, а не с использованием инструкции 'with'. Использование '{{form | getattr:" answer_1 "}}', вероятно, даст вам тот же результат, что и оператор 'with'. – Alasdair

+0

Кроме того, это ваш настоящий код? Для связанной формы я ожидал бы 'hasattr (value, arg)' и 'hasattr (value, 'has_key')' для возврата False. Поэтому я ожидаю, что ваш фильтр вернет 'settings.TEMPLATE_STRING_IF_INVALID'. – Alasdair

+0

@Alasdair Действительно, это то, что я тоже заметил. Мой фильтр возвращал «настройки».TEMPLATE_STRING_IF_INVALID', поэтому я добавил эту строку в метод '__init__' моего класса формы:' setattr (self, 'answer_% d'% i, self.fields ['answer_% d'% i]) '. Это неправильно? –

ответ

0

Используйте другой шаблон фильтр

Я не думаю, что getattr шаблона фильтр очень подходит для ваших целей. Мне не нравится проверка has_key, потому что она вернет False, хотя 'field_name' in Form - True.

Возможно, вы сможете получить тег шаблона, установив атрибуты в форме, но мне кажется, что он взломан. Лучшим подходом было бы использование другого фильтра шаблонов.

Если у вас есть form, тогда вы можете получить доступ к полю answer_1 с form['answer_1']. Используя эти знания, легко создать более подходящий шаблонный фильтр.

@register.filter(name='get_form_field') 
def get_form_field(form, field_name): 
    try: 
     return form[field_name] 
    except KeyError: 
     return settings.TEMPLATE_STRING_IF_INVALID 

Затем, в шаблоне, вы можете сделать

{{ form|get_form_field:"answer_1" }} 

Или, если вы используете with тег шаблона:

{% with "answer_1" as ans %} 
    {{ form|get_form_field:ans }} 
{% endwith %} 

Или попробовать другой подход

На самом деле, я не уверен, что вам нужен специальный фильтр. Вы можете добавить метод в свою форму, который возвращает список полей, которые вы хотите отобразить.

class MyForm(forms.Form): 
    def answer_fields(self): 
     return [self['answer_%d' % x] for range(1, 5)] 

Затем в вашем шаблоне пройдите через список и отрисуйте их.

{% for field in form.answer_fields %} 
    {{ form.answer_fields }} 
{% endfor %} 
+0

Этот новый шаблонный фильтр соответствует моим потребностям и прекрасно работает, спасибо вам большое! –

+0

О втором подходе, я не уверен, что вы правильно написали этот метод, может быть, плохой отступ, но я не вижу никаких возвращенных списков. –

+0

Рад слышать, что работает новый фильтр! Теперь я исправил этот метод во втором подходе. – Alasdair

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