Это часть проекта, в котором я застрял:
Поиск: позволяет пользователю вводить запрос в поле поиска на боковой панели для поиска записи энциклопедии. Если запрос совпадает с именем записи энциклопедии, пользователь должен быть перенаправлен на страницу этой записи. Если запрос не совпадает с названием записи энциклопедии, вместо этого пользователя следует перенаправить на страницу результатов поиска, на которой отображается список всех статей энциклопедии, в которых запрос является подстрокой. Например, если поисковый запрос был Py, то в результатах поиска должно появиться Python. Щелчок по любому имени записи на странице результатов поиска должен перенаправить пользователя на страницу этой записи.
мой код:
urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("wiki/<str:title>", views.wiki, name="wiki"),
path("search", views.search, name="search"),
]
util. py
import re
from django.core.files.base import ContentFile
from django.core.files.storage import default_storage
def list_entries():
"""
Returns a list of all names of encyclopedia entries.
"""
_, filenames = default_storage.listdir("entries")
return list(sorted(re.sub(r"\.md$", "", filename)
for filename in filenames if filename.endswith(".md")))
def save_entry(title, content):
"""
Saves an encyclopedia entry, given its title and Markdown
content. If an existing entry with the same title already exists,
it is replaced.
"""
filename = f"entries/{title}.md"
if default_storage.exists(filename):
default_storage.delete(filename)
default_storage.save(filename, ContentFile(content))
def get_entry(title):
"""
Retrieves an encyclopedia entry by its title. If no such
entry exists, the function returns None.
"""
try:
f = default_storage.open(f"entries/{title}.md")
return f.read().decode("utf-8")
except FileNotFoundError:
return None
views.py
from django.shortcuts import render
from . import util
def index(request):
return render(request, "encyclopedia/index.html", {
"entries": util.list_entries()
})
def wiki(request, title):
return render(request, "encyclopedia/wiki.html", {
"entries": util.get_entry(title)
})
def search(request):
entries = util.list_entries()
find_entries = list()
search_box = request.POST.get("q").capitalize()
if search_box in entries:
return HttpResponseRedirect(f"wiki/{search_box}")
for entry in entries:
if search_box in entry:
find_entries.append(entry)
else:
print(f'{find_entries}')
if find_entries:
return render(request, "encyclopedia/search.html", {
"search_result": find_entries,
"search": search_box
})
макет. 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 method="get" action="{% url 'search' %}">
{% csrf_token %}
<input 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>
поиск. html
{% extends "encyclopedia/layout.html" %}
{% block title %}
search results
{% endblock %}
{% block body %}
{% for result in search_result %}
<li><a href=wiki/{{ result }}>{{ result }}</a></li>
{% endfor %}
<h1>{{ no_result }}</h1>
{% endblock %}
Я получаю следующую ошибку: AttributeError в / search объект 'NoneType' не имеет атрибута 'capitalize'
пожалуйста, помогите