Django не понимает, что такое термин "редирект"
Я могу буквально закричать прямо сейчас.
Если это не одна проблема, то другая.
Почему Python так сложно понять, что это за функция redirect
?
Почему он не перенаправляет, несмотря на то, что я сказал ему перенаправлять? Какую часть redirect
не понимает Python? Почему он просто обновляет страницу, а формы больше нет?
Если бы я хотел, чтобы он обновлял страницу при отправке формы, я бы сказал ему обновлять страницу при отправке формы. Однако я указал ему перенаправлять на success
страницу при отправке формы, так почему же он не перенаправляет на success
страницу при отправке формы.
Я имею в виду, да ладно. Это простые базовые вещи, которые может понять человек, почему Python не может понять это?
Я просто в бешенстве от этой штуки. Абсолютно без всякой причины он просто решил:
Не, я не собираюсь сегодня перенаправлять, я просто собираюсь сделать что-то совершенно случайное, просто чтобы быть раздражительным.
MRE
Я буквально на пределе своих возможностей, я просто хочу, чтобы он перенаправлял на другую страницу. Мне приходится тратить так много времени на устранение неполадок, которые не нуждаются в устранении. Я не хочу, чтобы время было потрачено впустую только потому, что Django решил, что он собирается быть задницей. Мое терпение серьезно лопнуло с этой штукой, это действительно так.
Я так стараюсь быть спокойным и терпеливым с этой штукой, но она толкает меня, толкает и толкает.
Я пробовал:
if result:
print("Your ticket has been successfully created")
return redirect('success,html') # Redirect to a success page or URL
Я пробовал:
if result:
print("Your ticket has been successfully created")
return redirect('support/success.html') # Redirect to a success page or URL
Я пробовал:
if result:
print("Your ticket has been successfully created")
return redirect('support/templates/success') # Redirect to a success page or URL
Почему это так невозможно?
Если бы хоть одна вещь действительно делала то, что я ей сказал, это было бы чудом.
В журнале:
Your ticket has been successfully created
Но перенаправить не удается, ни один из журналов не выводится в feedback_submission
def в support.views
, что говорит о том, что Python игнорирует это. Почему он игнорирует это?
Очень, очень надоело это
Есть разница между django redirect и render. Рендер: Эта функция принимает запрос, html и необязательный контекст и выводит страницу.
Redirect : Эта функция принимает url на вход и перенаправляет на этот url. чтобы получить правильный url, используйте reverse_lazy. сделайте что-то вроде этого.
импорт reverse_lazy выглядит так
from django.urls import reverse_lazy
Затем используйте в функции перенаправления.
redirect(reverse_lazy('<url name>')) #url name u should have mentioned in urls.py of your app.
Django или Python, если уж на то пошло, не просто капризничают, они делают именно то, что вы им приказываете.
Упростив некоторые ненужные вещи в вашем коде, ошибка становится более очевидной - вы иногда возвращаете ответ redirect
, иногда form
.
def raise_support_ticket(request):
if request.method == 'POST':
form = LegalDocumentsFeedback(request.POST)
if form.is_valid():
...
return redirect('error.html') # returns a response!
else:
form = LegalDocumentsFeedback()
return form # returns a form!
Затем, в случае успешной отправки, функция legal__cookie_statement
не делает ничего, чтобы вернуть ответ перенаправления в Django, она просто помещает его в контекст рендеринга:
def legal__cookie_statement(request):
form = raise_support_ticket(request)
context = {'form': form} # `form` could be a HttpResponseRedirect!
return render (request, 'cookie-statement.html', context)
Если вы не возвращаете ответ в виде редиректа, он никуда вас не перенаправит.
При этом самым простым исправлением здесь является
def legal__cookie_statement(request):
form = raise_support_ticket(request)
if isinstance(form, HttpResponse): # oh, we got a response
return form
context = {'form': form}
return render (request, 'cookie-statement.html', context)
т.е. проверить, является ли form
на самом деле ответом, и если да, то просто вернуть его. Однако плохо, когда функция возвращает два совершенно разных типа объектов (forms.Form
и HttpResponse
), поэтому я бы вообще рефакторизовал эту функцию (используя FormView
, см. ниже, чтобы не делать столько работы вручную).
Кроме того, шаблон, который вы нам показываете, также не выводит никаких ошибок формы (подсказка: {{ form.errors }}
), поэтому вы не можете знать, действительно ли форма содержит ошибки.
Вам будет гораздо проще (не говоря уже о том, что все крайние случаи и т.д. будут обрабатываться автоматически), если вы будете использовать встроенные FormView
, что-то вроде:
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from django.views.generic import FormView
class RaiseSupportTicketView(FormView):
form_class = LegalDocumentsFeedback
success_url = reverse_lazy("submit")
template_name = "cookie-statement.html"
def form_valid(self, form):
# Extract data from the form
name = form.cleaned_data["name"]
subject = form.cleaned_data["subject"]
description = form.cleaned_data["description"]
email = form.cleaned_data["email"]
# Call a function to handle form data
result = handle_ticket_creation(name, subject, description, email)
if not result:
form.add_error(None, "Failed to create ticket. Please try again.")
return super().form_invalid(form)
return HttpResponseRedirect(self.get_success_url())
Затем вы подключаете его, например,
urlpatterns = [
path('submit', RaiseSupportTicketView.as_view()),
]
Вы должны вставить raise_support_ticket
в раздел action
тега вашей формы, см. пример ниже.
Пример action="{% url 'raise_support_ticket' %}"
Затем вам нужно будет создать еще один путь url
для размещения самого raise-support-ticket
и дать ему то же имя, что и для action="{% url '<PATH NAME>' %}"
, которое вы будете использовать для action
атрибута вашей формы
#support.urls
from django.urls import path
from django.shortcuts import render
from . import views
urlpatterns = [
path('raise-support-ticket/', views.successful_submission, name="successful_submission"),
path('raise_ticket/', views.raise_support_ticket, name='**raise_support_ticket**'),
]
#html
<h2>Feedback</h2>
<p>We welcome any and all feedback in relation to any legal information we provide on our website.</p>
<form method="post" action="{% url 'raise_support_ticket' %}">
{% csrf_token %}
{{form.name}}
{{form.subject}}
{{form.email}}<br/>
{{form.description}}<br/>
<button class="btn btn--pink btn--large" type="submit">Submit</button>
</form>