Получение __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)