Django-subclassed ModelChoiceField Encapsulation - PullRequest
1 голос
/ 20 апреля 2010

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

Так что-то вроде этого, хотя это не работает, потому что параметр набора запросов не установлен в конструкторе поля. Думаю, я мог бы передать "queryset = Test.object.none ()", но я бы предпочел, чтобы мои формы тоже не помещали этот фиктивный код там.

class MyForm(forms.Form):
    c = MyModelChoiceField(label='Test', required=False)

class MyModelChoiceField(forms.ModelChoiceField):
    def __init__(self, *args, **kwargs):
        super(MyModelChoiceField, self).__init__(*args, **kwargs)
        self.queryset = Test.objects.filter(id__gt=1)

Есть ли примеры того, как этого добиться? Я уверен, что есть - я просто не могу найти их сегодня с Google.

1 Ответ

3 голосов
/ 20 апреля 2010

Я думаю, что вместо установки набора запросов после супер __init__ вы могли бы переопределить kwargs, затем вызвать super:

class MyModelChoiceField(forms.ModelChoiceField):
    def __init__(self, *args, **kwargs):
        kwargs['queryset'] = Test.objects.filter(id__gt=1)
        super(MyModelChoiceField, self).__init__(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...