Получение __init__() получило неожиданный аргумент ключевого слова 'instance' с CreateView of Django

Некоторые детали:

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)

2 ответа

Решение

Я подозреваю класс UserForm должна быть модельная форма. Вы можете изменить поля, но они должны быть получены из `ModelForm.

Поэтому измените определение формы на

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

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

Я неправильно переопределяю метод __init __ () без начальных аргументов, как показано ниже.

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

И получить эту ошибку как результат

TypeError в / case / create

__init __ () получил неожиданный аргумент ключевого слова 'начальный'

Чтобы исправить это, я устанавливаю аргументы в __init __ () и передаю их при вызове суперкласса __init __ (), см. Результат ниже

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

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']

Я решил аналогичную ошибку, возникающую при попытке сохранить форму в базе данных. "Report() получил неожиданный аргумент ключевого слова 'сводка'"

Проблема заключалась в том, что имена полей в models.py и forms.py не совпадали.

В классе Report в models.py имя поля было "summary_input", но в forms.py оно было названо "summary", поэтому я изменил имя переменной в формах, чтобы оно соответствовало имени в моделях.

# 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)
Другие вопросы по тегам