HttpResponseRedirect в Django не перенаправляет на страницу views.py файл

#python #django #django-views #django-templates #response.redirect

#питон #django #django-просмотры #django-шаблоны #ответ.перенаправление #python #response.redirect

Вопрос:

Мой views.py выглядит как:

 from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from django import forms


from . import util
import markdown2


def index(request):
    return render(request, "encyclopedia/index.html", {
        "entries": util.list_entries()
    })


def entry(request, title):
    if title not in util.list_entries():
        return render(request, "encyclopedia/error.html", {
            "error": "Page Not Found",
            "query": title
        })
    else:
        return render(request, "encyclopedia/entry.html", {
            "entry": markdown2.markdown(util.get_entry(title)),
            "title": title
        })


def search(request):
    if request.POST["q"] in util.list_entries():
        return HttpResponseRedirect(reverse("entry", args=(request.POST["q"],)))
    else:
        return render(request, "encyclopedia/error.html")
  

Здесь мой urls.py:

 from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("<str:title>", views.entry, name="entry"),
    path("search", views.search, name="search")
]
  

Далее следует мой layout.html шаблон, какие другие страницы выходят за рамки этого:

 {% load static %}

<!DOCTYPE html>

<html lang="en">
    <head>
        <title>{% block title %}{% endblock %}</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3 Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
        <link href="{% static 'encyclopedia/styles.css' %}" rel="stylesheet">
    </head>
    <body>
        <div class="row">
            <div class="sidebar col-lg-2 col-md-3">
                <h2>Wiki</h2>
                <form action="{% url 'search' %}" method="POST">
                    {% csrf_token %}
                    <input class="search" type="text" name="q" placeholder="Search Encyclopedia">
                </form>
                <div>
                    <a href="{% url 'index' %}">Home</a>
                </div>
                <div>
                    Create New Page
                </div>
                <div>
                    Random Page
                </div>
                {% block nav %}
                {% endblock %}
            </div>
            <div class="main col-lg-10 col-md-9">
                {% block body %}
                {% endblock %}
            </div>
        </div>

    </body>
</html>
  

Что мне здесь нужно, так это перенаправление пользователя на страницу ввода, если поиск соответствует запросу (если он совпадает с моей записью). Моя функция ввода в views.py работает нормально (что рендерит entry.html если название совпадает), но функция поиска не перенаправляет на страницу ввода. Каков правильный путь в этой ситуации?

Ответ №1:

 if request.POST["q"] in util.list_entries():
  

Эта строка будет соответствовать только в том случае, если строка поиска точно соответствует записи.

Вы можете перебирать записи и проверять, содержит ли запись строку поиска. Например:

 for entry in util.list_entries():
    if request.POST["q"] in entry:
        return HttpResponseRedirect(reverse("entry", args=(entry,)))
  

Комментарии:

1. Аласдэр, да, твоя версия хороша. Но он также не работает в моей функции. Здесь что-то должно быть изменено

2. В моем ответе отсутствовал () in util.list_entries() раньше.

3. Если это не сработает, я не смогу помочь в отладке — я не знаю, какой результат или ошибку вы получаете или что util.list_entries() возвращает. Попробуйте добавить в свой код множество операторов печати (например print(util.list_entries) , print(request.POST["q"]) , print(entry) , print(request.POST["q"] in entry) . Это должно помочь вам определить, где ваш код работает не так, как вы ожидаете.

Ответ №2:

Возможно, вам придется использовать «перенаправление» для импорта redirect :

 from django.shortcuts import redirect
  

Это может сработать.

Ответ №3:

Исправлено. Проблема заключалась в urls.py файл моего приложения. Произошло столкновение путей.