Django - Как перебирать и проверять каждый выбор ModelChoiceField в коде шаблона - PullRequest
3 голосов
/ 28 августа 2011

У меня есть форма (отредактированная для краткости) следующим образом:

class InteractionForm(forms.Form):
    def __init__(self, *args, **kwargs):

        # Each object within this queryset is a model object of type InteractionChoice
        choices_qs = interaction.interactionchoice_set.all()

        self.fields['choices'] = forms.ModelChoiceField(
                                    widget=forms.RadioSelect(),
                                    queryset=choices_qs,

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

class InteractionChoice(models.Model):
    interaction = models.ForeignKey(Interaction)
    name = models.CharField(max_length=255)
    is_answer = models.BooleanField(default=False)

Экземпляр InteractionForm передается из представления в шаблон и обрабатывается с помощью:

{{ form.choices }}

Мой вопрос заключается в том, существует ли способ перебора каждого варианта в моем шаблоне и доступ к одному из его свойств, в частности, к свойству is_answer, определенному в InteractionChoice. Цель состоит в том, чтобы настроить отображение выбора, если это действительно ответ. Более конкретно, если is_answer - «Истина», я бы мог изменить атрибут class на <label> для этого выбора.

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

Заранее спасибо.

Обновление 1: Думая об этом больше после ответа @rczajka, я не верю, что смогу достичь того, что я надеюсь сделать в коде шаблона. Вместо этого, если цель состоит в том, чтобы изменить атрибут класса тега, возможно, мне следует искать подкласс и переопределять определенные методы в forms.widgets.RadioInput, forms.widgets.RadioFieldRenderer и forms.widgets.RadioSelect. Я буду копаться в этом больше.

Ответы [ 3 ]

1 голос
/ 29 августа 2011

Я придумал одно решение, которое решает эту проблему. Это, по меньшей мере, хакерство, но это единственный подход, о котором я думал, который работает до сих пор без большого количества внутренних изменений в моем существующем дизайне.

Мой подход проистекает из этой статьи о создании подклассов 'RadioFieldRenderer' и 'RadioSelect'.

В методе __unicode__ для модели InteractionChoice я возвращаю:

return self.name + "_" + str(self.is_answer)

, которое является значением, используемым для метки переключателя (среди прочего). Затем я вложил в подклассы forms.widgets.RadioInput, forms.widgets.RadioFieldRenderer и forms.widgets.RadioSelect.

Для пользовательского класса RadioInput я переопределил его метод __unicode__, добавив логику для добавления строки class, значение которой в конечном итоге определяется строкой, возвращаемой из метода unicode в InteractionChoice - в строку тега <label> возвращается.

Для пользовательского класса RadioFieldRenderer я переопределил __iter__ и __getitem__, чтобы использовать пользовательский класс RadioInput.

Для пользовательского класса RadioSelect я переопределил свойство renderer, чтобы использовать свой собственный рендерер радиополя.

Это явно далеко от идеального решения. Надеюсь, что получится лучше.

1 голос
/ 24 апреля 2012

Я нашел похожую проблему, но решил ее по-другому.

Как получить экземпляры ModelChoiceField в шаблоне

Перебор свойства поля набора запросов.

0 голосов
/ 28 августа 2011

Вы должны создать подкласс ModelChoiceField и переопределить label_from_instance.Здесь говорится так: https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield:

Метод unicode модели будет вызван для генерации строковых представлений объектов для использования в выборе поля;чтобы предоставить настраиваемые представления, создайте подкласс ModelChoiceField и переопределите label_from_instance.Этот метод получит объект модели и должен вернуть строку, подходящую для его представления.

...