Поиск частичного совпадения файлов в Django - PullRequest
0 голосов
/ 10 июля 2020

Я изучаю веб-курс cs50 и работаю в Django.

Мне нужно выбрать файлы MD на основе ключевого слова, которое пользователь ищет. Если запрос не соответствует имени файла, вместо этого пользователь должен перейти на страницу результатов поиска, на которой отображается список всех файлов, содержащих запрос в виде подстроки. Например, если поисковый запрос был Py, то Python должно появиться в результатах поиска, если такой файл существует.

Проблема в том, что я не знаю, как это сделать. Также мы не используем sql.

Вот 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

Вот моя функция просмотров:

    def entry(request, title): #based on the url it shows a md file
        try:
            content = markdown2.markdown(util.get_entry(title))
        except:
            return HttpResponseNotFound("Page not found")
    
        return render(request, "encyclopedia/entry.html", {
            "entry": content, "title": title.capitalize()
        })
    
    
    def search(request): 
        keyword = request.GET.get('q')
        result = util.get_entry(keyword)
    
        if result:  #if the keyword matches a title, return that result
            content = markdown2.markdown(util.get_entry(result))
            return redirect('entry', result)

        else: #here i should return results that match the substring query
#stuck
            results = util.get_entry('%keyword%')
            return render(request, "encyclopedia/results.html", {
            "results": results
        })

Строка поиска:

<form method="get" action="{% url 'search' %}">
{% csrf_token %}
<input type="text" name="q" placeholder="Search Encyclopedia">
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...