首页 > 解决方案 > 如何通过请求从自定义表单的输入文本字段中获取值: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>

网址.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'),
]

模型.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}

这是我得到的错误:

文件“/home/zaid/inventoryManagement/venv/src/ims/views.py”,第 13 行,在 addItem item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity) AttributeError: 'QueryDict'对象没有属性“item_name”

请帮助我从输入字段中获取值。

标签: pythondjangopython-3.7django-3.0

解决方案


你的错误:

item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity)
  • data是 a QueryDict,因此您必须使用data['item_name']or访问其中的数据,就像访问data.get('item_name')常规dict.
  • item_description(...)实际上并没有做任何事情。它不会将任何内容保存到数据库中。要保存到数据库,您必须使用item_description.objects.create(...).

您的代码的其他问题:

  • 您自己呈现表单字段
  • 您自己提取 POST 数据
  • 您尝试自行保存到数据库
  • 您缺少输入验证(如果缺少某些必需的值怎么办?例如,如果item_name未提交怎么办?)
  • 如果用户输入了不合适的值(例如长度为 201 的字符串),您没有向用户提供合适的错误消息作为反馈。

DjangoModelForm能够处理所有这些问题,所以请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

然后,创建一个ModelFormin forms.py

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>

推荐阅读