Я пытаюсь отобразить страницу результатов поиска. Если запрос найден, он будет перенаправлен на страницу ввода. В противном случае, если подстрока запроса будет найдена, отобразится страница результатов поиска с записью, показанной в виде ссылки, и если щелкнуть эту ссылку, отобразится страница ввода. Вот мой код, как показано ниже, пожалуйста, помогите:
urls.py:
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("search", views.search, name="search"),
path("edit", views.edit, name="edit"),
path("<str:title>", views.entry, name="entry")
]
views.py:
from . import util
import markdown2
import random
from django.shortcuts import HttpResponse
from django.http import HttpResponseRedirect
from django.urls import reverse
from django import forms
def index(request):
entries = util.list_entries()
rand = random.choice(entries)
return render(request, "encyclopedia/index.html", {
"random": rand,
"entries": entries
})
def entry(request, title):
entries = util.list_entries()
rand = random.choice(entries)
try:
mark_content = util.get_entry(title)
output = markdown2.markdown(mark_content)
return render(request, "encyclopedia/title.html", {
"content": output,
"random": rand,
"title": title
})
except TypeError:
return render(request, "encyclopedia/error.html", {
"random": rand
})
def search(request):
# get search input from user
search_entry = request.POST['q']
# results = list()
# get entries list
entries = util.list_entries()
# search list
results = []
# try to search if there is such entry in entries
if request.method == "POST":
if search_entry in entries:
return HttpResponseRedirect(reverse("title", args=(search_entry,)))
else:
for entry in entries:
if search_entry in entry:
results.append(entry)
return render(request, "encyclopedia/search.html", {
"results": results
})
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>
<a href="">Create New Page</a>
</div>
<div>
<a href="{% url 'entry' random %}">Random Page</a>
</div>
{% block nav %}
{% endblock %}
</div>
<div class="main col-lg-10 col-md-9">
{% block body %}
{% endblock %}
</div>
</div>
</body>
</html>
search. html
{% extends "encyclopedia/layout.html" %}
{% block title %}
Search Results
{% endblock %}
{% block body %}
<h2>Search results:</h2>
<ul>
{% for result in results %}
<li>
<a href="{% url 'entry' result %}">{{ result }}</a>
</li>
{% empty %}
<li>No result.</li>
{% endfor %}
</ul>
{% endblock %}
Q1: Я использую POST в качестве метода запроса, потому что я хочу отображать URL-адрес как / wiki / search для страницы результатов поиска, но с GET в качестве метода URL будет иметь вид? q = &. Я немного запутался в этой части, потому что, когда я ищу HTML в Википедии, URL-адрес будет иметь вид: https://en.wikipedia.org/wiki/HTML, но когда я щелкаю правой кнопкой мыши и проверяю страницу, метод будет «GET ".
Q2: Следует ли мне использовать здесь TypeError? Если пользователь вводит URL-адрес как wiki / hello, а в качестве приветственной страницы нет страницы входа, то отображается страница с ошибкой, указывающая, что страницы приветствия нет.
Q3: Когда я выполнял поиск, он всегда показывает страницу с ошибкой. Зачем? Я указал аргументы функции входа, но, похоже, она не получает правильный аргумент.