在 Python 中将元组传递给 __init__

Passing Tuple into __init__ in Python

我有一个class这样的。

class AddNoteForm(forms.Form):
    def __init__(self, test_values, *args):
        self.custom_choices = test_values
        super(AddNoteForm, self).__init__()
        self.fields['choices'] = forms.ModelMultipleChoiceField(label='Test Choices', choices=self.custom_choices)

我想在 class 创建期间传递这个元组。

test_values = (
    ('name1', 'value1'), 
    ('name2', 'value2'),
    ('name3', 'value3'),
)

form = AddNoteForm(test_values)

但每当我这样做时,我都会得到 __init__() takes at least 2 arguments (2 given) 错误。我也在使用 python 2.7(和 Django 1.8)。

我查看调试页面中的变量,self.custom_choices 包含正确的值(test_values 我传递给函数的值)。

有什么想法吗?

ModelMultipleChoiceField 需要一个查询集作为它的第一个参数(在 self 之后)。您在这里需要的是一个常规的 MultipleChoiceField。

我还把 args/kwargs 传递给超类 init,这是一个很好的做法,因为表单可以采用很多有用的参数,例如 'initial',你可能想要使用一些时间,然后当它不起作用时它会让你发疯......

class AddNoteForm(forms.Form):
    def __init__(self, test_values, *args, **kwargs):
        self.custom_choices = test_values
        super(AddNoteForm, self).__init__(*args, **kwargs)
        self.fields['choices'] = forms.MultipleChoiceField(
          label='Test Choices',
          choices=self.custom_choices
        )