django,uni_form和python的__init __()函数 - 如何将参数传递给表单?

时间:2009-11-09 09:50:33

标签: python django django-forms init

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

1 个答案:

答案 0 :(得分:4)

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

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