如何通过请求从自定义表单的输入文本字段中获取值:Django 3.0?
How do I get the values from input text fields from my custom form through the request: Django 3.0?
所以,我一直在努力,从自定义表单中的输入字段中获取值。
我有一个 url 对应于该表单,该表单再次将其重定向到相同的表单。
表单url的视图检查请求方法是否为Post。如果是,那么我声明一个等于 request.POST
的变量,然后我将这些值分配给我的模型 - item_description()。这是 views.py
:
的代码
def addItem(request):
if request.method == "POST":
data = request.POST
print(data.__dict__)
item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity)
else:
HttpResponse("Something went wrong!")
return render(request, 'ims/addItemForm.html')
HTML形式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>IMS| Add Item</title>
</head>
<body>
<form action="{% url 'Item-addition' %}" method="post">
{% csrf_token %}
<input type="text" name="item_name" placeholder="Enter Item Name">
<input type="text" name="item_number" placeholder="Enter Item Number">
<input type="text" name="item_quantity" placeholder="Enter Item Quantity">
<button type="submit" name="add" value="add">Add Item</button>
</form>
<a href="{% url 'Items-list' %}">See items</a>
</body>
</html>
urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('add_item', views.addItem, name='Item-addition'),
path('items', views.itemsList, name='Items-list'),
]
models.py:
from django.db import models
class item_description(models.Model):
item_name = models.CharField(max_length=200)
item_number = models.CharField(max_length=200)
item_quantity = models.CharField(max_length=200)
def __str__(self):
return self.item_name
此外,我打印了一个字典请求,但它没有任何值。这是打印的请求字典:{'_encoding': 'utf-8', '_mutable': False}
。
这是我收到的错误:
File "/home/zaid/inventoryManagement/venv/src/ims/views.py", line 13, in addItem
item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity)
AttributeError: 'QueryDict' object has no attribute 'item_name'
请帮我从输入字段中获取值。
你的错误:
item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity)
data
是一个 QueryDict
,因此您必须像访问常规 dict
一样使用 data['item_name']
或 data.get('item_name')
访问其中的数据。
item_description(...)
实际上什么也没做。它不会将任何内容保存到数据库中。要保存到数据库,必须使用item_description.objects.create(...)
.
您的代码的其他问题:
- 您自己呈现表单字段
- 您自己提取 POST 数据
- 您尝试自行保存到数据库
- 您缺少输入验证(如果缺少某些必填值怎么办?例如,如果未提交
item_name
怎么办?)
- 如果 he/she 输入了不合适的值(例如长度为 201 的字符串),您没有提供合适的错误消息作为反馈给用户。
Django 的 ModelForm
能够处理所有这些问题,所以请改用 ModelForm
。
如果models.py
是这样的:
from django.db import models
class ItemDescription(models.Model):
item_name = models.CharField(max_length=200)
item_number = models.CharField(max_length=200)
item_quantity = models.CharField(max_length=200)
def __str__(self):
return self.item_name
然后,在forms.py
中创建一个ModelForm
:
from django import forms
from .models import ItemDescription
class ItemDescriptioneForm(forms.ModelForm):
class Meta:
model = ItemDescription
fields = ['item_name', 'item_number', 'item_quantity']
在您的 views.py
中,使用您刚刚创建的 ModelForm
:
from django.shortcuts import render, redirect
from .forms import ItemDescriptionForm
def addItem(request):
if request.method == 'POST':
form = ItemDescriptionForm(request.POST)
if form.is_valid():
form.save()
return redirect('Items-list')
else:
form = ItemDescriptionForm()
return render(request, 'ims/addItemForm.html', {
'form': form,
})
在您的模板中显示表单:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Add Item</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" />
</form>
</body>
</html>
所以,我一直在努力,从自定义表单中的输入字段中获取值。
我有一个 url 对应于该表单,该表单再次将其重定向到相同的表单。
表单url的视图检查请求方法是否为Post。如果是,那么我声明一个等于 request.POST
的变量,然后我将这些值分配给我的模型 - item_description()。这是 views.py
:
def addItem(request):
if request.method == "POST":
data = request.POST
print(data.__dict__)
item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity)
else:
HttpResponse("Something went wrong!")
return render(request, 'ims/addItemForm.html')
HTML形式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>IMS| Add Item</title>
</head>
<body>
<form action="{% url 'Item-addition' %}" method="post">
{% csrf_token %}
<input type="text" name="item_name" placeholder="Enter Item Name">
<input type="text" name="item_number" placeholder="Enter Item Number">
<input type="text" name="item_quantity" placeholder="Enter Item Quantity">
<button type="submit" name="add" value="add">Add Item</button>
</form>
<a href="{% url 'Items-list' %}">See items</a>
</body>
</html>
urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('add_item', views.addItem, name='Item-addition'),
path('items', views.itemsList, name='Items-list'),
]
models.py:
from django.db import models
class item_description(models.Model):
item_name = models.CharField(max_length=200)
item_number = models.CharField(max_length=200)
item_quantity = models.CharField(max_length=200)
def __str__(self):
return self.item_name
此外,我打印了一个字典请求,但它没有任何值。这是打印的请求字典:{'_encoding': 'utf-8', '_mutable': False}
。
这是我收到的错误:
File "/home/zaid/inventoryManagement/venv/src/ims/views.py", line 13, in addItem item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity) AttributeError: 'QueryDict' object has no attribute 'item_name'
请帮我从输入字段中获取值。
你的错误:
item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity)
data
是一个QueryDict
,因此您必须像访问常规dict
一样使用data['item_name']
或data.get('item_name')
访问其中的数据。item_description(...)
实际上什么也没做。它不会将任何内容保存到数据库中。要保存到数据库,必须使用item_description.objects.create(...)
.
您的代码的其他问题:
- 您自己呈现表单字段
- 您自己提取 POST 数据
- 您尝试自行保存到数据库
- 您缺少输入验证(如果缺少某些必填值怎么办?例如,如果未提交
item_name
怎么办?) - 如果 he/she 输入了不合适的值(例如长度为 201 的字符串),您没有提供合适的错误消息作为反馈给用户。
Django 的 ModelForm
能够处理所有这些问题,所以请改用 ModelForm
。
如果models.py
是这样的:
from django.db import models
class ItemDescription(models.Model):
item_name = models.CharField(max_length=200)
item_number = models.CharField(max_length=200)
item_quantity = models.CharField(max_length=200)
def __str__(self):
return self.item_name
然后,在forms.py
中创建一个ModelForm
:
from django import forms
from .models import ItemDescription
class ItemDescriptioneForm(forms.ModelForm):
class Meta:
model = ItemDescription
fields = ['item_name', 'item_number', 'item_quantity']
在您的 views.py
中,使用您刚刚创建的 ModelForm
:
from django.shortcuts import render, redirect
from .forms import ItemDescriptionForm
def addItem(request):
if request.method == 'POST':
form = ItemDescriptionForm(request.POST)
if form.is_valid():
form.save()
return redirect('Items-list')
else:
form = ItemDescriptionForm()
return render(request, 'ims/addItemForm.html', {
'form': form,
})
在您的模板中显示表单:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Add Item</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" />
</form>
</body>
</html>