Как я могу получить значения из текстовых полей ввода из моей пользовательской формы через запрос: Django 3.0? - PullRequest
0 голосов
/ 19 февраля 2020

Итак, я очень старался, получая значения из полей ввода в моей пользовательской форме.

У меня есть 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}.

Вот ошибка, которую я получаю:

Файл "/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'

Пожалуйста, помогите мне получить значения из полей ввода.

1 Ответ

1 голос
/ 19 февраля 2020

Ваши ошибки:

item_description(item_name=data.item_name, item_number=data.item_number, item_quantity=data.item_quantity)
  • data - это QueryDict, поэтому вы должны получить доступ к данным в нем, используя data['item_name'] или data.get('item_name') как вы бы за обычный dict.
  • item_description(...) на самом деле ничего не делали. Это ничего не сохраняет в базу данных. Чтобы сохранить в базе данных, вы должны использовать item_description.objects.create(...).

Другие проблемы с вашим кодом:

  • вы отображаете поля формы на вашем собственные
  • вы извлекаете данные POST самостоятельно
  • вы пытаетесь сохранить в базе данных самостоятельно
  • вам не хватает проверки ввода (что, если отсутствуют некоторые обязательные значения ? Например, что если item_name не отправлено?)
  • Вы не предоставили пользователю подходящее сообщение об ошибке в качестве обратной связи, если он вводит неправильные значения (например, строка длиной 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

Затем создайте ModelForm в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...