Пользовательский рендеринг radioselect в форме django / доступ к одному элементу - PullRequest
4 голосов
/ 07 июня 2010

У меня есть такая форма:

CHOICES = [  
           ('a', 'a_value'),  
           ('b', 'b_value'),  
           ('c', 'c_value')  
]  

self.fields["choice"] = forms.ChoiceField(  
    widget=RadioSelect(),  
    choices=CHOICES,   
)  

Как я могу выбрать один элемент этого поля формы в моем шаблоне? Я хочу быть в состоянии сделать что-то вроде:

<tr><td>{{form.choice.a}}</td><td>some custom extra field</td></tr>

Или есть другой способ изменить способ отображения RadioSelect?

Ответы [ 3 ]

7 голосов
/ 13 апреля 2013

См. Полный документ - https://docs.djangoproject.com/en/dev/ref/forms/widgets/#radioselect

{% for radio in form.my_radio_select %}
- {{ radio.choice_label }}
- {{ radio.tag }}
{% endfor %}
1 голос
/ 09 июля 2010

Я несколько часов работал над этим, пытаясь найти какой-нибудь способ использовать пользовательский рендерер в RadioSelect, но нет способа передать номер выбора. Вместо этого я пошел на клуджий, но простой подход. Добавил функцию __init__ к моей форме:

def __init__(self, *args, **kwargs):
    super(FormName, self).__init__(*args, **kwargs)
    self.radiofield_choice = re.findall(r'<li>(.+?)</li>',
                                        unicode(self['radiofield_name']))

При создании виджета используется рендеринг RadioSelect по умолчанию, а затем анализируется отдельный выбор HTML. Вы могли бы даже объединить это с определенными вариантами, чтобы создать словарь вместо списка.

В моем шаблоне я использовал {{ form.radiofield_choice.0|safe }} для рендеринга только первого элемента. Увеличьте ноль, чтобы получить другие предметы.

Если по какой-то причине необходимы только поля ввода без меток, используйте r'(<input.+/>)'.

1 голос
/ 07 июня 2010

Вы не можете сделать это через параметры или что-то еще, способ визуализации жестко закодирован в его классе виджетов! См. Например http://code.djangoproject.com/browser/django/trunk/django/forms/widgets.py: RadioSelect.render (-> RadioFieldRenderer.render); создайте подкласс и переопределите метод рендера, затем используйте его в вашей форме myfield = forms.MultipleChoiceField(widget=MyWidget(...)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...