在Python中将元组传递给__init__

时间:2015-07-24 03:06:13

标签: python django python-2.7 django-forms

我有一个这样的课。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

ModelMultipleChoiceField期望查询集作为其第一个参数(在self之后)。你想要的是一个常规的MultipleChoiceField。

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

#include <iostream>
#include <string>
using namespace std;

class Cat
{
public:
    Cat();
    ~Cat();
    int GetAge() { return itsAge; }
    void SetAge(int age) { itsAge = age; }

private:
    int itsAge;
};

Cat::Cat() : itsAge(0)
{
}

Cat::~Cat()
{
}

int main(int argc, char* argv[])
{

    Cat *cats = new Cat[5];
    for( int i = 0; i < 5; ++i )
    {
      cats[i].SetAge( i + 1 );
    }

    //Here cats points to the first cat so, it will print 2
    cout << cats[1].GetAge()<< endl;

    //Now cat will be pointing to second cat as pointer will be moved forward by one
    cats = cats + 1;

    //below statement will print 3, as cats[0] is pointing to 2nd cat, and cats[1] will be pointing to 3rd cat
    cout << cats[1].GetAge()<< endl;

    return 0;
}