В форме Django, как я могу просмотреть отдельные параметры для каждого поля? - PullRequest
4 голосов
/ 12 ноября 2011

Я создаю мастера форм. На первом шаге у меня есть форма с одним полем. Это поле является внешним ключом. Стандартный виджет Django для внешнего ключа дает мне опции поля в раскрывающемся меню (выбрать) и представляет каждую опцию как опцию html. Я изменил виджет по умолчанию на RadioSelect. Так что теперь он дает мне опции поля с помощью переключателей.

Вот мой forms.py

class ChooseProductTypeForm(ModelForm):
    class Meta:
        model = Product
        widgets = {
            'type': RadioSelect,
        }

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

Я надеялся, что это будет так же просто, как:

{% for field in form %}
    {% for option in field %}
        {{ option.image }}
        {{ option.title }}
        {{ option.description }}
    {% endfor %}
{% endfor %}

После полутора дней исследований я решил посмотреть, что скажет сообщество. FWIW, я нашел несколько решений, которые будут работать, но они очень сложны. Должен быть более простой способ, нет?

Ответы [ 3 ]

7 голосов
/ 12 ноября 2011

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

{% for field in form %}
    {% for option in field.field.choices.queryset %}
        {{ option.image }}
        {{ option.title }}
        {{ option.description }}
    {% endfor %}
{% endfor %}
0 голосов
/ 12 ноября 2011

Я вижу, что это делается двумя способами.

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

Другой, более быстрый метод - добавить в форму функцию, которая обрабатывает это и возвращает нужные вам данные

class ChooseProductTypeForm(ModelForm):
    def get_my_modelfield(self):
        for option in self.fields['my_modelfield'].queryset:
            yield {
              'image': option.image, 
              'title': option.title, 
              'description': option.description
           }

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

Недостатком этого является то, что вы не можете просто циклически проходить по полям в вашей форме, вы получитевыводить каждый явно.Конечно, вы также можете играть с __iter__ в вашей форме, но это может быть слишком хакерским.Не уверен, что вы имеете дело здесь полностью:)

0 голосов
/ 12 ноября 2011

Извините, но поля не повторяются так, как вы надеетесь. То, что вы пытаетесь повторить, не является набором запросов; это ModelChoiceField. Вы можете получить доступ к отдельным вариантам, но они внутренне представлены в виде двух кортежей с идентификатором внешнего ключа в качестве первого элемента и представлением __unicode__ в качестве второго элемента.

Как вы сказали, однако, есть способы решить эту проблему. Лучший способ, хотя это и немного некрасиво, это, вероятно, отправить словарь с необходимой информацией, используя идентификаторы модели в качестве ключей. Вы можете использовать values ​​queryset , чтобы сделать это довольно легко.

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