Django данные доступа передаются в форму - PullRequest
0 голосов
/ 16 июня 2010

В моей форме есть choiceField, где я отображаю отфильтрованные данные.Для фильтрации данных мне нужны два аргумента.Первый не проблема, потому что я могу взять его непосредственно от объекта, но второй генерируется динамически.Вот некоторый код:

class GroupAdd(forms.Form):
    def __init__(self, *args, **kwargs):
        self.pid = kwargs.pop('parent_id', None)

        super(GroupAdd, self).__init__(*args, **kwargs)

    parent_id = forms.IntegerField(widget=forms.HiddenInput)
    choices = forms.ChoiceField(
        choices = [
            [group.node_id, group.name] for group in Objtree.objects.filter(
                 type_id = ObjtreeTypes.objects.values_list('type_id').filter(name = 'group'), 
                 parent_id = 50
            ).distinct()] + [[0, 'Add a new one']
        ], 
        widget = forms.Select(
            attrs = {
                'id': 'group_select'
            }
        )
     )

Я хотел бы изменить parent_id, который передается в Objtree.objects.filter.Как вы можете видеть, я пытался в функции init, а также с kwargs['initial']['parent_id'], а затем вызывать ее с self, но это не работает, поскольку это выходит за рамки ... это было в значительной степени мое последнее усилие.Мне нужно получить доступ к нему либо через параметр initial, либо напрямую через поле parent_id, поскольку оно уже содержит свое значение (передано через initial).

Любая помощь приветствуется, так как у меня заканчиваетсяидей.

1 Ответ

2 голосов
/ 16 июня 2010

ОК, пару небольших замечаний, прежде чем я отвечу на ваш вопрос.

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

Во-вторых, ваш запрос на получение объектов Objtree гораздо лучше написан с использованием нотации двойного подчеркивания для обхода отношений:

Objtree.objects.filter(type__name='group', parent_id=50)

Теперь актуальный вопрос. Как вы заметили, вы не можете получить доступ к локальным переменным или переменным экземпляра в объявлениях полей. Это атрибуты уровня класса, которые обрабатываются (через метакласс) при определении класса, а не при его создании. Так что вам нужно сделать все это в __init__.

Как это:

class GroupAdd(forms.Form):
    parent_id = forms.IntegerField(widget=forms.HiddenInput)
    choices = forms.ModelChoiceField(queryset=None)

    def __init__(self, *args, **kwargs):
        pid = kwargs.pop('parent_id', None)
        super(GroupAdd, self).__init__(*args, **kwargs)
        self.fields['choices'].queryset = Objtree.objects.filter(
                                              type__name='group', parent_id=pid
                                          )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...