Функция django, uni_form и python __init __ () - как передать аргументы в форму? - PullRequest
2 голосов
/ 09 ноября 2009

Мне трудно понять, как работает функция python __init__ (). То, что я пытаюсь сделать, это создать новую форму в django и использовать помощник uni_form для отображения формы настраиваемым способом, используя fieldsets, однако я передаю в форму аргумент, который должен немного изменить макет формы и я не могу понять, как заставить это работать. Вот мой код:

class MyForm(forms.Form):
    name = forms.CharField(label=_("Your name"), max_length=100, widget=forms.TextInput())
    city = forms.CharField(label=_("Your city"), max_length=100, widget=forms.TextInput())
    postal_code = forms.CharField(label=_("Postal code"), max_length=7, widget=forms.TextInput(), required=False)

    def __init__(self, city, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        if city == "Vancouver":
            self.canada = True

    if self.canada:
        # create an extra uni_form fieldset that shows the postal code field
    else:
        # create the form without the postal code field

Однако причина, по которой это не работает для меня. Кажется, что self.canada никогда не имеет никакого значения за пределами __init__, и поэтому, несмотря на то, что я передал этот аргумент функции, я не могу использовать это значение в своем классе. Я нашел обходной путь для этого, который заключается в создании формы полностью внутри __init__ с использованием self.fields, но это ужасно. Как использовать self.canada вне __init__?

1 Ответ

4 голосов
/ 09 ноября 2009

Вы неправильно поняли, как работают классы в Python. Вы пытаетесь запустить код внутри класса, но вне какой-либо функции, что вряд ли сработает, особенно если это зависит от того, что происходит внутри __init__. Этот код будет оцениваться при первом импорте класса, тогда как __init__ происходит при создании каждой формы.

Лучшим способом, безусловно, было бы включить наборы полей в форму, но просто не отображать их, когда Канада имеет значение True. Ваш код __init__ может установить для этих полей значение required=False в зависимости от этого значения, поэтому вы не получите ошибок проверки.

...