2

我有点难以理解 python __init__( ) 函数的工作原理。我想要做的是在 django 中创建一个新表单,并使用 uni_form 助手使用字段集以自定义方式显示表单,但是我将一个参数传递给应该稍微改变表单布局的表单而且我不知道如何使这项工作。这是我的代码:

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__,因此即使我将该参数传递给函数,我也无法在我的类中使用该值。我找到了一个解决方法,即使用 self.fields 完全在内部创建表单__init__,但这很难看。我如何在之外使用 self.canada __init__

4

1 回答 1

4

您误解了类在 Python 中的工作方式。您正在尝试在类内部但在任何函数之外运行代码,这不太可能起作用,特别是如果它取决于内部发生的事情__init__。该代码将在第一次导入类时进行评估,而__init__在实例化每个表单时发生。

最好的方法肯定是在表单中包含字段集,但当 canada 为 True 时根本不显示它们。您的__init__代码可以将这些字段设置为required=False依赖于该值,因此您不会收到验证错误。

于 2009-11-09T10:03:10.227 回答