2010-04-19 5 views
1

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

Так что-то вроде этого, хотя это не работает, потому что параметр queryset не задан в конструкторе поля. Думаю, я мог бы передать «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 сегодня.

ответ

3

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

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