Привязка данных к форме django Параметры ChoiceField для рендеринга

У меня есть форма (сгенерированная фабрикой форм) со специальным полем

def MyFormGenerator(data):
    CHOICES = <created_using_data_value>
    class MyForm(form.Form):
        myfield = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect)
    return MyForm

Что мне нужно сделать, так это связать некоторые переменные python с каждым выбором, чтобы шаблон мог использовать их во время рендеринга (каждый выбор будет размещен в div с подробной информацией об этом выборе).

Я могу придумать 2 способа сделать это. (№ 1 предпочтительнее для гибкости) 1) Дайте шаблону отдельный список полей, которые должны отображаться (с включенными данными), и пусть шаблон захватывает и отображает каждое поле по мере необходимости. 2) Привяжите данные к полю, чтобы шаблон мог захватить и использовать их во время итерации.

Я почти могу сделать #1 (вручную создать поле ввода в шаблоне), но я не могу понять, как вызвать выбор поля по имени, используя переменную, так как трудно понять, что не работает, когда _some_field_ является переменной шаблона.

Прямо сейчас я буквально воссоздаю поле из SCRATCH в шаблоне (воссоздавая значения выбора и т. д.), но это далеко не идеально.


person DarwinSurvivor    schedule 25.08.2011    source источник
comment
Можете ли вы уточнить, что вы имеете в виду под данными для поля? метки? help_text в модели? Или что-то с предыдущей страницы форм? Можете ли вы опубликовать свою текущую форму или смоделировать то, что вы хотите?   -  person j_syk    schedule 25.08.2011
comment
Извините, я неправильно выразился, мне действительно нужны данные для каждой опции поля выбора (радио-кнопки). Поле if для выбора способа доставки (наземный, usps и т. д.), и мне нужно прикрепить некоторые данные к каждому варианту, который может использовать шаблон. Данные будут состоять из словаря значений, таких как ожидаемая дата прибытия, стоимость, описания и т. д.   -  person DarwinSurvivor    schedule 26.08.2011


Ответы (2)


Взгляните на MultipleModelChoiceField Django для форм.

Это позволяет вам использовать наборы запросов другой модели в качестве полей выбора. Если ваш выбор будет содержать так много данных о нем, возможно, ему в любом случае будет лучше иметь свою собственную модель. Это будет работать, если есть какой-то способ запросить, какие результаты вы хотите отобразить, даже если вы назначите им целочисленное поле для общих группировок. В худшем случае у вас просто гигантские запросы (по длине кода) с множеством исключений, фильтров и т. д.

field1 = forms.MultipleModelChoiceField(queryset=MyModel.objects.filter(method="UPS"), empty_label="(None)")

По умолчанию он использует виджет SelectMultiple, но его можно переопределить с помощью kwarg.

person j_syk    schedule 26.08.2011
comment
Это будет работать, за исключением того, что выбор не относится к одной таблице. На сайте используется система плагинов (с модулем регистрации приложений для регистрации класса), и вы выбираете 1 вариант из множества вариантов, предлагаемых любым из плагинов. Это для выбора доставки, и существует несколько модулей доставки (фиксированная ставка, почта Канады, USPS и т. д.), и каждый из них имеет разные варианты (единая ставка за 10 дней, фиксированная ставка на следующий день, ускоренная почта Канады и т. д.). Пользователю необходимо выбрать один вариант из всех доступных. - person DarwinSurvivor; 27.08.2011

Я нашел самый простой способ сделать это — прикрепить данные к представлению, а не к самому полю выбора.

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

def my_view(request):
    form = MyForm()
    myfield_choices = zip(form['myfield'], choices_data)
    ...

Затем вы можете просмотреть варианты в своем шаблоне следующим образом:

{% for choice, data in myfield_choices %}
    ...
{% endfor %}
person Jonathan Potter    schedule 22.05.2015