Передача данных в формы Django - PullRequest
3 голосов
/ 21 апреля 2011
class Test(forms.Form):

    def set_choices(self, choices):
        self.choices = choices

    def get_choices(self):
        return self.choices

    options  = forms.ChoiceField(choices=get_choices())

f = Test()
f.set_choices(...)

Почему это невозможно?
Как еще можно достичь цели передачи данных в класс Test?
Заранее спасибо.

Ответы [ 2 ]

10 голосов
/ 21 апреля 2011

Это основная проблема Python. Вам нужно подумать о порядке выполнения этих команд и их объеме.

Сначала вы определяете класс формы с именем Test. Этот класс имеет три атрибута: метод set_choices, метод get_choices и поле options. Эти определения оцениваются, когда определяется сам класс. Определение options вызывает get_choices(). Однако на данный момент в области действия нет метода get_choices, поскольку класс еще не определен.

Даже если вам каким-то образом удалось решить проблему с областью действия, это все равно не даст желаемого результата, поскольку определение вариантов для options выполняется в определенное время. Даже если вы позже позвоните set_choices, options все равно будет иметь значение get_choices, которое было возвращено при определении поля.

Итак, что вы на самом деле хотите сделать? Кажется, вы хотите установить динамический выбор в поле options. Итак, вы должны переопределить метод __init__ и определить их там.

class Test(forms.Form):
    options = forms.ChoiceField(choices=())

    def __init__(self, *args, **kwargs):
        choices = kwargs.pop('choices', None)
        super(Test, self).__init__(*args, **kwargs)
        if choices is not None:
            self.fields['options'].choices = choices
0 голосов
/ 21 апреля 2011

Расширение __init__ - это хороший способ динамически добавлять опции к ChoiceField, как Даниэль Роузман объясняет в его ответ .

Просто добавить к этому ... добавление параметров во время выполнения является хакерским (в лучшем случае). Вот заметка о лучших практиках (прямо из документации Django ChoiceField ) -

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

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