我尝试使用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}
错过了什么?...
答案 0 :(得分:1)
这是导致错误的行:
args = {'form': form, 'name': name, 'sn': sn, 'desc': desc}
此处未定义 name
,sn
和desc
。
因此,您需要获取已保存的对象并访问其属性:
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的答案:
...虽然当表单无效时会失败。因此,您可能需要添加一些代码来处理这种情况。