/ system / invn / create name'name'中的NameError未定义为modelForm

时间:2018-05-10 12:54:56

标签: python django django-forms

我尝试使用ModelForm创建一个将其保存到数据库的表单。但是得到了一个错误。

这里是我的models.py

class Inventory(models.Model):
    name = models.CharField(max_length=255)
    sn = models.DecimalField(max_digits=20, decimal_places=0)
    desc = models.TextField(blank=True, null=True, default='Tidak ada deskripsi')

这是我的forms.py

class InventoryForm(forms.ModelForm):
    name = forms.CharField(max_length=255)
    sn = forms.DecimalField(max_digits=20, decimal_places=0)
    desc = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Inventory
        fields = ('name', 'sn', 'desc',)

这是我的views.py

class InventoryCreateView(TemplateView):
    template_name ='system/inventory_form.html'
    def get(self, request):
        form = InventoryForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = InventoryForm(request.POST)
        if form.is_valid():
            form.save()

        args = {'form': form, 'name': name, 'sn': sn, 'desc': desc}
        return render(request, self.template_name, args)

来自NameError at /system/invn/create name 'name' is not defined modelForm

args = {'form': form, 'name': name, 'sn': sn, 'desc': desc}

错过了什么?...

2 个答案:

答案 0 :(得分:1)

这是导致错误的行:

args = {'form': form, 'name': name, 'sn': sn, 'desc': desc}
此处未定义

namesndesc

因此,您需要获取已保存的对象并访问其属性:

if form.is_valid():
    inventory = form.save()

args = {'form': form, 'name': inventory.name, 'sn': inventory.sn, 'desc': inventory.desc}

...虽然当表单无效时会失败。因此,您可能需要添加一些代码来处理这种情况。

答案 1 :(得分:0)

您正试图直接从name方法获取modelform中的post字段。

您的post方法没有名为name的变量。请注意,您已将form作为arg传递,可以在template中使用。

在您的模板中,您可以使用您作为上下文传递的form arg中的值。但是,如果您真的特别希望在args上下文中传递它们,则可以从form.cleaned_data传递它们,因为它在is_valid()中得到验证,如:

def post(self, request):
    form = InventoryForm(request.POST)
    if form.is_valid():
        form.save()

    args = {
        'form': form, 
        'name': form.cleaned_data.get('name'), 
        'sn': form.cleaned_data.get('sn'), 
        'desc': form.cleaned_data.get('desc')
   }
   return render(request, self.template_name, args)

+1关于Ashish Acharya的答案:

  

...虽然当表单无效时会失败。因此,您可能需要添加一些代码来处理这种情况。