Собранные данные формы Django не отображаются в целевом URL, который содержит HTML представление.

Вопрос или проблема

Я создал форму Django, которая запрашивает у пользователя ввести свой заказ для последующего отображения на другой странице, но когда я нажимаю кнопку отправки, меня перенаправляет на нужный URL, не показывая данные, введенные пользователем в форме.

Вот код view.py:

from django.shortcuts import render, HttpResponseRedirect
from django import forms 

# Создайте свои представления здесь.

orders_stock = ['наушники', 'вакуумные наушники', 'инструменты для DIY']



class NewOrder(forms.Form):
    get_order = forms.CharField(label="Ваш заказ", max_length=50)


def form(request):
    if request.method == 'POST':
        item = NewOrder(request.POST)
        if item.is_valid():
            get_order = item.cleaned_data['get_order']
            orders_stock.append(get_order)
            return HttpResponseRedirect('form/orders.html')
        else:
            return render(request, 'form/form.html', {
                'items': orders_stock
            })

    return render(request, 'form/form.html', {
        'form': NewOrder()
    })


def order(request):
    return render(request, 'form/orders.html', {
        'items': orders_stock,
    })

Вот form.html:

<!DOCTYPE html>

<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Форма</title>
</head>
<body>
    <h2>Отправка формы</h2>
    <form action="{% url 'formsubmit:order'%}" method="post">
        {% csrf_token %}
        {{form}}
        <input type="submit" value="Отправить">
    </form>
</body>
</html>

А вот код orders.html, который обрабатывает отображение добавленных заказов:

<!DOCTYPE html>


<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Заказы</title>
</head>
<body>
    <h2>Заказы</h2>
    <ul>
        {% for order in items %}
            <li>{{order}}</li>
        {% endfor %}
    </ul>
</body>
</html>

А вот код urls.py:

from . import views
from django.urls import path


app_name="formsubmit"

urlpatterns = [
    path('', views.form, name="form"),
    path('order', views.order, name="order")
]

Я пробовал множество решений, но ничего не работает должным образом.

В вашем коде есть несколько проблем, которые мешают ему работать так, как ожидалось. Вот необходимые изменения.

1. Перенаправление на правильный URL: Когда форма успешно отправлена, HttpResponseRedirect должен перенаправлять на представление order. Однако URL в вашем коде, form/orders.html, не является именем URL. Вместо этого используйте HttpResponseRedirect(reverse('formsubmit:order')).

2. Действие формы в шаблоне form.html: В вашем HTML-шаблоне action="{% url 'formsubmit:order' %}" указывает на страницу отображения заказов, в то время как на самом деле это должно указывать на маршрут отправки формы (formsubmit:form). Это нужно, чтобы данные POST попали в правильное представление, которое обрабатывает отправку формы.

Вот измененный код.

  • views.py
from django.shortcuts import render, HttpResponseRedirect
from django import forms 

# Создайте свои представления здесь.

orders_stock = ['наушники', 'вакуумные наушники', 'инструменты для DIY']



class NewOrder(forms.Form):
    get_order = forms.CharField(label="Ваш заказ", max_length=50)


def form(request):
    if request.method == 'POST':
        item = NewOrder(request.POST)
        if item.is_valid():
            get_order = item.cleaned_data['get_order']
            orders_stock.append(get_order)
            
            # Перенаправление на представление 'order' после успешной отправки
            return HttpResponseRedirect(reverse('formsubmit:order'))
        else:
            return render(request, 'form/form.html', {
                'items': orders_stock
            })

    return render(request, 'form/form.html', {
        'form': NewOrder()
    })


def order(request):
    return render(request, 'form/orders.html', {
        'items': orders_stock,
    })
  • form.html
<!DOCTYPE html>

<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Форма</title>
</head>
<body>
    <h2>Отправка формы</h2>
    <form action="{% url 'formsubmit:form' %}" method="post">
        {% csrf_token %}
        {{form}}
        <input type="submit" value="Отправить">
    </form>
</body>
</html>

Надеюсь, это немного поможет вам.

Ответ или решение

Ваш код содержит несколько проблем, которые мешают корректному отображению данных после отправки формы. Давайте разберем необходимые изменения шаг за шагом.

1. Исправление редиректа в views.py

Когда форма успешно отправляется и проходит проверку, необходимо редиректить пользователя на страницу, где отображаются заказы. В текущем коде используется HttpResponseRedirect('form/orders.html'), который не указывает на правильный URL. Вместо этого следует использовать HttpResponseRedirect(reverse('formsubmit:order')). Также не забудьте импортировать функцию reverse.

2. Изменение действия формы в form.html

В вашей HTML-форме действие (action) указывает на URL, который предназначен для отображения заказов, а не для обработки данных формы. Вместо action="{% url 'formsubmit:order' %}" используйте action="{% url 'formsubmit:form' %}". Это обеспечит правильную отправку данных в представление, обрабатывающее отправку формы.

Исправленный код

Ниже приведен исправленный код для всех ваших файлов.

views.py

from django.shortcuts import render, HttpResponseRedirect
from django import forms 
from django.urls import reverse  # Импортируйте reverse

orders_stock = ['headphones', 'earbuds', 'diy tools']

class NewOrder(forms.Form):
    get_order = forms.CharField(label="Ваш заказ", max_length=50)

def form(request):
    if request.method == 'POST':
        item = NewOrder(request.POST)
        if item.is_valid():
            get_order = item.cleaned_data['get_order']
            orders_stock.append(get_order)
            # Редирект на представление 'order' после успешной отправки
            return HttpResponseRedirect(reverse('formsubmit:order'))
        else:
            return render(request, 'form/form.html', {
                'items': orders_stock,
                'form': item  # Отправляем форму обратно с ошибками, если есть
            })

    return render(request, 'form/form.html', {
        'form': NewOrder()
    })

def order(request):
    return render(request, 'form/orders.html', {
        'items': orders_stock,
    })

form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Форма</title>
</head>
<body>
    <h2>Отправка формы</h2>
    <form action="{% url 'formsubmit:form' %}" method="post">
        {% csrf_token %}
        {{ form }}  <!-- Выводим форму -->
        <input type="submit" value="Отправить">
    </form>
</body>
</html>

orders.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Заказы</title>
</head>
<body>
    <h2>Заказы</h2>
    <ul>
        {% for order in items %}
            <li>{{ order }}</li>  <!-- Отображаем каждый заказ -->
        {% endfor %}
    </ul>
</body>
</html>

urls.py

from . import views
from django.urls import path

app_name = "formsubmit"

urlpatterns = [
    path('', views.form, name="form"),
    path('order', views.order, name="order")
]

Заключение

В результате вышеуказанных изменений ваша форма теперь будет корректно отправлять данные, и после успешной отправки пользователь будет перенаправлен на страницу заказов, где будут отображены все сделанные заказы. Убедитесь, что у вас установлены правильные URL и все файлы шаблонов находятся на своих местах.

Оцените материал
Добавить комментарий

Капча загружается...