Вопрос или проблема
Я создал форму 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 и все файлы шаблонов находятся на своих местах.