Привязка данных к форме django для отображения параметров ChoiceField - PullRequest
1 голос
/ 25 августа 2011

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

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 в шаблоне (воссоздание значений выбора и т. д.), но это далеко от идеала.

Ответы [ 2 ]

0 голосов
/ 23 мая 2015

Самый простой способ, который я нашел, - это прикрепить данные в представлении вместо самого поля выбора.

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

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

Затем вы можете циклически просмотреть варианты в вашем шаблоне, как это:

{% for choice, data in myfield_choices %}
    ...
{% endfor %}
0 голосов
/ 26 августа 2011

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

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

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

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

...