使用Django的CreateView时,出现了“__init __()”收到意外关键字参数“instance”的错误。

50

一些细节:

Request Method: GET
Request URL: http://localhost:8080/user/create
Django Version: 1.5.1
Exception Type: TypeError
Exception Value: ____init____() got an unexpected keyword argument 'instance'
Exception Location: /place/venv/local/lib/python2.7/site-packages/django/views/generic/edit.py in get_form, line 35
Python Executable: /place/venv/bin/python
Python Version: 2.7.3

views.py

class UserCreateView(CreateView):
    model = models.User
    form_class = forms.UserForm

urls.py

url(r'^user/create$', UserCreateView.as_view(), name='user_create'),

forms.py

class UserForm(forms.Form):
    GROUP_CHOICES = [(-1, '[Choose]')]
    GROUP_CHOICES += [(group.id, group.name.capitalize()) for group in auth.models.Group.objects.all()]

    email = forms.EmailField(
        label='Email',
        widget=forms.TextInput(attrs={'placeholder': 'Email'})
    )
    first_name = forms.CharField(
        label='First Name',
        widget=forms.TextInput(attrs={'placeholder': 'First Name'})
    )
    last_name = forms.CharField(
        label='Last Name',
        widget=forms.TextInput(attrs={'placeholder': 'Last Name'})
    )
    password = forms.CharField(
        label='Password',
        widget=forms.PasswordInput(attrs={'placeholder': 'Password'})
    )
    password_validation = forms.CharField(
        label='Repeat Password',
        widget=forms.PasswordInput(attrs={'placeholder': 'Repeat Password'})
    )
    mobile_number = forms.CharField(
        label='Mobile Number',
        widget=forms.TextInput(attrs={'placeholder': 'Mobile Number'})
    )
    office_number = forms.CharField(
        label='Office Number',
        widget=forms.TextInput(attrs={'placeholder': 'Office Number'})
    )
    group = forms.ChoiceField(
        label='Group',
        choices=GROUP_CHOICES
    )

    def clean_password_validation(self):
        if self.cleaned_data['password'] == self.cleaned_data['password_validation']:
            return self.cleaned_data['password_validation']
        else:
            raise forms.ValidationError('Passwords don\'t match')

    def clean_group(self):
        if self.cleaned_data['group'] != -1:
            return self.cleaned_data['group']
        else:
            raise forms.ValidationError('Please, choose a group')

models.py

class User(models.Model):
    user = models.OneToOneField(auth.models.User)
    mobile_number = models.CharField(max_length=64)
    office_number = models.CharField(max_length=64)
4个回答

107

我怀疑类UserForm应该是model form。您可能想要更改字段,但它应该派生自`ModelForm`。

因此,请将表单定义更改为:

class UserForm(forms.ModelForm):
   class Meta:
       model = User
       fields = [...] # list of fields you want from model

   #or define fields that you want.
   ....

9
在CreateView中,是否可以制作一个不需要模型的表单? - hlkstuv_23900
2
@tilaprimera:我认为在CreateView中这是不可能的,但你可以使用FormView并手动重写form_valid() - SaeX
年份是它的工作。class UserForm(forms.ModelForm) 替换 forms.Form :) - Atabekdemurtaza

2
我错误地覆盖了__init__()方法,没有初始参数,如下所示。
class MyForm(forms.ModelForm):
    ...
    def __init__(self):
        super(CaseForm, self).__init__()
        ...

作为结果,我得到了以下错误

在/case/create处发生TypeError

__init__()收到了一个意外的关键字参数'initial'

为了解决这个问题,我设置了__init__()的参数,并在调用超类__init__()时传递它们,请参见下面的结果

class MyForm(forms.ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        super(CaseForm, self).__init__(*args, **kwargs)
        ...

1

forms.py 定义了方括号中的字段,例如fields=['field 1', 'field 2',...]

class CustomerForm(forms.ModelForm):        
    class Meta:
        model = Customer
        fields = ['fname','lname','email','address','city','state','zip','username','password','age','mobile','phone']

1
我曾遇到一个类似的错误,当我尝试将表单保存到数据库时。"Report() got an unexpected keyword argument 'summary'"。
问题是models.py和forms.py中的字段名称不匹配。
在models.py中的Report类中,字段名为"summary_input",但在forms.py中它被命名为"summary",因此我将forms中的变量名更改为与models中的变量名匹配。
# models.py
class Report(models.Model):
    summary_input = models.TextField()

# forms.py
class ReportForm(forms.Form):
    summary = forms.CharField(widget=forms.widgets.Textarea)
    # changed to 
    # summary_input = forms.CharField(widget=forms.widgets.Textarea)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接