#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. В моем ответе отсутствовал
()
inutil.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 файл моего приложения. Произошло столкновение путей.