【问题标题】:Passing Tuple into __init__ in Python在 Python 中将元组传递给 __init__
【发布时间】:2015-10-14 14:16:46
【问题描述】:

我有这样的课。

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)

我想在创建类时传递这个元组。

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)。

有什么想法吗?

【问题讨论】:

  • forms.Form 的方法签名是什么,AddNoteForm 从中继承?

标签: python django python-2.7 django-forms


【解决方案1】:

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
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2014-05-25
    • 2013-02-20
    相关资源
    最近更新 更多