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>
Вернуться на верх