Django EditStamdata() 得到了一个意外的关键字参数 'instance'
Django EditStamdata() got an unexpected keyword argument 'instance'
他,
加载表单时出现错误:
from django import forms
from .models import CountryList, Stamdata
from django.db.models.functions import Lower
from django.contrib.auth.models import User
class EditStamdata(forms.ModelForm):
Firmanavn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Firmanavn')
EMail = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control', 'autofocus': True}), label='EMail')
Bank = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control', 'autofocus': True}), label='Bank')
Navn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Navn')
Adresse = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control'}),label='Adresse')
Land = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control'}),queryset=CountryList.objects.values_list('countryname', flat=True).order_by('code'), initial='Denmark', to_field_name='countryname')
CVRCountrycode = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control col-md-4'}),label='CVR Landkode', queryset=CountryList.objects.values_list('code', flat=True).order_by('code'), initial='DK', to_field_name='code')
CVR = forms.IntegerField(widget=forms.TextInput(attrs={'class': 'form-control'}),label='CVR Nummer')
class Meta:
model = Stamdata
labels = {
'Byen': 'By',
'CVRCountrycode': 'Landekode',
'CVR': 'CVR Nummer',
}
fields = ['Firmanavn', 'UserID', 'Adresse', 'Land', 'CVRCountrycode', 'CVR', 'EMail', 'Bank', 'Navn']
和视图:
def EditStamdata(request):
StamdataData = get_object_or_404(Stamdata, pk=1)
# if this is a POST request we need to process the form data
if request.method == 'POST':
form = EditStamdata(request.POST, instance=StamdataData)
if form.is_valid():
form.save()
return HttpResponseRedirect('backend/stamdata.html')
else:
print ('somethin goes wrong')
form = EditStamdata(instance=StamdataData)
return render(
request,
'backend/stamdata.html',
{'form': form },
)
然后我收到此错误消息:
EditStamdata() 得到了意外的关键字参数 'instance'
如果我 google 如果他们使用 forms.ModelForm 就有人修复它,但我使用它。
您为视图指定了与表单相同的名称,因此 Django 调用了视图函数。因此,您应该至少重命名两者之一。
一般在Python中,函数都写在snake_case
中,所以可以将EditStamdata
重命名为edit_stamdata
。此外,Django 表单通常有一个 Form
后缀。因此,您可以将表单重命名为 EditStamdataForm
:
# app/forms.py
from django import forms
from .models import CountryList, Stamdata
from django.db.models.functions import Lower
from django.contrib.auth.models import User
class EditStamdata<b>Form</b>(forms.ModelForm):
Firmanavn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Firmanavn')
EMail = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control', 'autofocus': True}), label='EMail')
Bank = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control', 'autofocus': True}), label='Bank')
Navn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Navn')
Adresse = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control'}),label='Adresse')
Land = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control'}),queryset=CountryList.objects.values_list('countryname', flat=True).order_by('code'), initial='Denmark', to_field_name='countryname')
CVRCountrycode = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control col-md-4'}),label='CVR Landkode', queryset=CountryList.objects.values_list('code', flat=True).order_by('code'), initial='DK', to_field_name='code')
CVR = forms.IntegerField(widget=forms.TextInput(attrs={'class': 'form-control'}),label='CVR Nummer')
class Meta:
model = Stamdata
labels = {
'Byen': 'By',
'CVRCountrycode': 'Landekode',
'CVR': 'CVR Nummer',
}
fields = ['Firmanavn', 'UserID', 'Adresse', 'Land', 'CVRCountrycode', 'CVR', 'EMail', 'Bank', 'Navn']
在视图中,我们更改视图的名称,并为表单使用新名称:
def <b>edit_stamdata</b>(request):
StamdataData = get_object_or_404(Stamdata, pk=1)
if request.method == 'POST':
form = <b>EditStamdataForm</b>(request.POST, instance=StamdataData)
if form.is_valid():
form.save()
return HttpResponseRedirect('backend/stamdata.html')
else:
print ('somethin goes wrong')
form = <b>EditStamdataForm</b>(instance=StamdataData)
return render(
request,
'backend/stamdata.html',
{'form': form },
)
一些额外的提示:
- 局部变量通常也写成蛇形,所以
stamdata_data
而不是 StamdataData
;
- 您可以使用
redirect(..)
[Django-doc],并传递 视图的名称 以使 URL 分辨率更可靠;
- 在 Django 中,人们经常 而不是 对 URL 路径使用
.html
后缀;和
- 通常不会用
.values_list(..)
定义 queryset=…
,这通常用于进行一些过滤。
他,
加载表单时出现错误:
from django import forms
from .models import CountryList, Stamdata
from django.db.models.functions import Lower
from django.contrib.auth.models import User
class EditStamdata(forms.ModelForm):
Firmanavn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Firmanavn')
EMail = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control', 'autofocus': True}), label='EMail')
Bank = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control', 'autofocus': True}), label='Bank')
Navn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Navn')
Adresse = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control'}),label='Adresse')
Land = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control'}),queryset=CountryList.objects.values_list('countryname', flat=True).order_by('code'), initial='Denmark', to_field_name='countryname')
CVRCountrycode = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control col-md-4'}),label='CVR Landkode', queryset=CountryList.objects.values_list('code', flat=True).order_by('code'), initial='DK', to_field_name='code')
CVR = forms.IntegerField(widget=forms.TextInput(attrs={'class': 'form-control'}),label='CVR Nummer')
class Meta:
model = Stamdata
labels = {
'Byen': 'By',
'CVRCountrycode': 'Landekode',
'CVR': 'CVR Nummer',
}
fields = ['Firmanavn', 'UserID', 'Adresse', 'Land', 'CVRCountrycode', 'CVR', 'EMail', 'Bank', 'Navn']
和视图:
def EditStamdata(request):
StamdataData = get_object_or_404(Stamdata, pk=1)
# if this is a POST request we need to process the form data
if request.method == 'POST':
form = EditStamdata(request.POST, instance=StamdataData)
if form.is_valid():
form.save()
return HttpResponseRedirect('backend/stamdata.html')
else:
print ('somethin goes wrong')
form = EditStamdata(instance=StamdataData)
return render(
request,
'backend/stamdata.html',
{'form': form },
)
然后我收到此错误消息:
EditStamdata() 得到了意外的关键字参数 'instance'
如果我 google 如果他们使用 forms.ModelForm 就有人修复它,但我使用它。
您为视图指定了与表单相同的名称,因此 Django 调用了视图函数。因此,您应该至少重命名两者之一。
一般在Python中,函数都写在snake_case
中,所以可以将EditStamdata
重命名为edit_stamdata
。此外,Django 表单通常有一个 Form
后缀。因此,您可以将表单重命名为 EditStamdataForm
:
# app/forms.py
from django import forms
from .models import CountryList, Stamdata
from django.db.models.functions import Lower
from django.contrib.auth.models import User
class EditStamdata<b>Form</b>(forms.ModelForm):
Firmanavn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Firmanavn')
EMail = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control', 'autofocus': True}), label='EMail')
Bank = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control', 'autofocus': True}), label='Bank')
Navn = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), label='Navn')
Adresse = forms.CharField(widget=forms.Textarea(attrs={'rows' :'4', 'class': 'form-control'}),label='Adresse')
Land = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control'}),queryset=CountryList.objects.values_list('countryname', flat=True).order_by('code'), initial='Denmark', to_field_name='countryname')
CVRCountrycode = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control col-md-4'}),label='CVR Landkode', queryset=CountryList.objects.values_list('code', flat=True).order_by('code'), initial='DK', to_field_name='code')
CVR = forms.IntegerField(widget=forms.TextInput(attrs={'class': 'form-control'}),label='CVR Nummer')
class Meta:
model = Stamdata
labels = {
'Byen': 'By',
'CVRCountrycode': 'Landekode',
'CVR': 'CVR Nummer',
}
fields = ['Firmanavn', 'UserID', 'Adresse', 'Land', 'CVRCountrycode', 'CVR', 'EMail', 'Bank', 'Navn']
在视图中,我们更改视图的名称,并为表单使用新名称:
def <b>edit_stamdata</b>(request):
StamdataData = get_object_or_404(Stamdata, pk=1)
if request.method == 'POST':
form = <b>EditStamdataForm</b>(request.POST, instance=StamdataData)
if form.is_valid():
form.save()
return HttpResponseRedirect('backend/stamdata.html')
else:
print ('somethin goes wrong')
form = <b>EditStamdataForm</b>(instance=StamdataData)
return render(
request,
'backend/stamdata.html',
{'form': form },
)
一些额外的提示:
- 局部变量通常也写成蛇形,所以
stamdata_data
而不是StamdataData
; - 您可以使用
redirect(..)
[Django-doc],并传递 视图的名称 以使 URL 分辨率更可靠; - 在 Django 中,人们经常 而不是 对 URL 路径使用
.html
后缀;和 - 通常不会用
.values_list(..)
定义queryset=…
,这通常用于进行一些过滤。