首页 > 解决方案 > Django EditStamdata() 得到了一个意外的关键字参数“实例”

问题描述

嘿嘿,

如果我加载表单,我会收到错误:

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() 得到了一个意外的关键字参数“实例”

如果我用谷歌搜索它,如果他们使用 forms.ModelForm 但我会使用它。

标签: djangomodelform

解决方案


您为视图提供了与表单相同的名称,因此 Django 调用了视图函数。因此,您应该重命名两者中的至少一个。

通常在 Python 中,函数snake_caseEditStamdataedit_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 EditStamdataForm(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 edit_stamdata(request):
    StamdataData = get_object_or_404(Stamdata, pk=1)
    if request.method == 'POST':
        form = EditStamdataForm(request.POST, instance=StamdataData)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('backend/stamdata.html')
    else:
        print ('somethin goes wrong')
        form = EditStamdataForm(instance=StamdataData)
    return render(
        request,
        'backend/stamdata.html', 
        {'form':  form },
    )

一些额外的提示:

  1. 局部变量通常也写在蛇的情况下,所以stamdata_data而不是StamdataData;
  2. 您可以使用redirect(..)[Django-doc],并传递视图名称以使 URL 解析更加健壮;
  3. 在 Django 中,通常不使用URL.html路径的后缀;和
  4. one 通常不使用 a 定义 a queryset=….values_list(..)这通常用于进行一些过滤。

推荐阅读