Почему эти атрибуты класса не регистрируются? - PullRequest
0 голосов
/ 09 апреля 2010

У меня есть фабричный метод, который генерирует классы форм django, например:

def get_indicator_form(indicator, patient):
    class IndicatorForm(forms.Form):
        #These don't work!
        indicator_id = forms.IntegerField(initial=indicator.id, widget=forms.HiddenInput())
        patient_id = forms.IntegerField(initial=patient.id, widget=forms.HiddenInput())

        def __init__(self, *args, **kwargs):
            forms.Form.__init__(self, *args, **kwargs)
            self.indicator = indicator
            self.patient = patient

    #These do!
    setattr(IndicatorForm, 'indicator_id',  forms.IntegerField(initial=indicator.id, widget=forms.HiddenInput()))
    setattr(IndicatorForm, 'patient_id', forms.IntegerField(initial=patient.id, widget=forms.HiddenInput()))

    for field in indicator.indicatorfield_set.all():
        setattr(IndicatorForm, field.name, copy(field.get_field_type()))

    return type('IndicatorForm', (forms.Form,), dict(IndicatorForm.__dict__))

Я пытаюсь понять, почему объявления полей верхней формы не работают, но метод setattr ниже работает. Я довольно плохо знаком с Python, поэтому я подозреваю, что это какая-то языковая особенность, которую я неправильно понимаю. Можете ли вы помочь мне понять, почему объявления полей в верхней части класса не добавляют поля в класс?

В возможно связанной записке, когда создаются эти классы, instance.media ничего не возвращает, даже если в некоторых полях есть виджеты со связанным носителем.

Спасибо, Пит

1 Ответ

1 голос
/ 09 апреля 2010

Попробуйте это:

def get_indicator_form(indicator, patient):
    class IndicatorForm(forms.Form):
        indicator_id = forms.IntegerField(initial=indicator.id, widget=forms.HiddenInput())
        patient_id = forms.IntegerField(initial=patient.id, widget=forms.HiddenInput())

        def __init__(self, *args, **kwargs):
            forms.Form.__init__(self, *args, **kwargs)
            self.indicator = indicator
            self.patient = patient

    for field in indicator.indicatorfield_set.all():
        IndicatorForm.base_fields[field.name] = field.get_field_type()

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