Проблема с отрисовкой формы Django
Интересно, может ли кто-нибудь помочь мне с тем, что я делаю неправильно.
Я хочу представить форму заказа в Django, в которой клиент будет заполнять только заказ, ему никогда не понадобится получать существующий заказ. Поэтому я думаю, что мне нужен только метод POST и не нужен метод GET.
Когда я пытаюсь отобразить url с формой, я получаю ответ 405.
В моем файле views.py, где, как мне кажется, я допускаю ошибку, у меня есть:
class RequestReport(View):
def post(self, request, *args, **kwargs):
form = CustomerOrderForm(data=request.POST)
if form.is_valid():
form.save()
return render(
"order.html",
{
"form": CustomerOrderForm()
}
)
А в файле urls моего приложения у меня есть:
urlpatterns = [
path('', views.RequestHome.as_view(), name='home'),
path('order', views.RequestReport.as_view(), name='order'),
path('blog', views.RequestBlog.as_view(), name='blog'),
path('<slug:slug>/', views.PostDetail.as_view(), name='post-detail'),
]
И, наконец, в моем файле order.html у меня есть:
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" class="report-buttons">
</form>
Я знаю, что форма заказа клиента в порядке, потому что если я вставляю ее в представление, она отображается правильно
class RequestReport(CreateView):
form_class = CustomerOrderForm
template_name = 'order.html'
success_url = "about"
но я хочу иметь возможность опубликовать форму.
Благодарю за любую помощь.
Вам все еще нужно достичь формы, т.е. "перейти" на url, где находится эта форма, не отправляя ее, так что это будет get запрос
405 - это ошибка Method Not Allowed
. Поскольку вы делаете запрос get при переходе к /order
, а ваше представление не реализовало метод get
, это приводит к 405 ошибке.
class RequestReport(View):
def post(self, request, *args, **kwargs):
form = CustomerOrderForm(data=request.POST)
if form.is_valid():
form.save()
return redirect("somewhere else")
def get(self, request, *args, **kwargs):
return render(
request,
"order.html",
{
"form": CustomerOrderForm()
}
)