#python #html #django
#python #HTML #django
Вопрос:
У меня есть проект по созданию вики-страницы в Django, и мне нужно обработать слово, отправленное из поля поиска, и отобразить его информацию на экране, если слово соответствует сохраненной информации. Для этого я хочу отправить параметр с помощью метода «POST» из следующего шаблона html.
<form action="{% url 'wiki:index' %}" method="post">
{% csrf_token %}
<input class="search" type="text" name="q" placeholder="Search Encyclopedia">
<input type="submit">
</form>
Идея заключается в том, чтобы параметр был получен следующими функциями моего файла views.py написано на языке Django.
def index(request):
if request.method == "POST":
title = request.POST["q"]
return redirect("wiki:languages")
else:
return render(request, "encyclopedia/index.html", {
"entries": util.list_entries()
})
def languages(request, title):
return render(request, "encyclopedia/definitions.html", {
"title": util.get_entry(title)
})
Этот файл содержит следующие предложения заголовка:
from django import forms
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.urls import reverse
from . import util
Функция «Languages», в свою очередь, обрабатывает функцию get_entry (title) «util.py » код
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
У меня есть следующие пути, указанные в файле «urls.py «
urlpatterns = [
path("", views.index, name="index"),
path("wiki/<str:title>", views.languages, name="languages"),
]
Это предназначено для отображения содержимого «файла. md» находится в каталоге «записи» и имя которого соответствует тексту, введенному в поле поиска шаблона html. Однако при этом отображается следующая ошибка:
NoReverseMatch at /
Reverse for 'languages' with no arguments not found. 1 pattern(s) tried: ['wiki/(?P<title>[^/] )$']
Request Method: POST
Request URL: http://127.0.0.1:8000/
Django Version: 3.1.2
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'languages' with no arguments not found. 1 pattern(s) tried: ['wiki/(?P<title>[^/] )$']
Я пытался использовать параметр «форма», но, возможно, я не знал, как его использовать, и я не достиг цели.
Я надеюсь, что вы можете помочь мне изменить мои функции в Django и html, чтобы правильно использовать функцию «get_entry (title)» и отобразить содержимое файла «.md», которое соответствует введенной информации.
Комментарии:
1. поскольку вы указали name=»languages» в пути, проверьте основной urls.py и посмотрите, есть ли у вас настройка app_name в вашем проекте, и проверьте, можете ли вы получить доступ с помощью app_name.url_name, например, если ваше имя приложения app1, затем посмотрите, можете ли вы получить доступ к app1.languages.
2. Я подтверждаю, что файл «urls.py » содержит имя приложения «app_name = «wiki» . Что касается вашего предложения, я не знаю, правильно ли я понял или сделал это неправильно, но соединение отклонено. В основном «urls.py » файл Я добавил строку: path(‘ ‘, include(«app1.urls»)) и из функции index я изменил перенаправление на функцию «языки» следующим образом: return redirect(«app1.languages») , но соединение отклонено. Пожалуйста, подтвердите, что это то, что вы предложили, или вам лучше попробовать что-то еще.
3. обратное перенаправление («wiki: languages») здесь вы выполняете обычное перенаправление, и languages ожидает вызова URL-адреса languages с параметром. Попробуйте выполнить перенаправление, передав полученный ввод из post в качестве параметра в URL. Надеюсь, это поможет
4. Да, этого не хватает, но я не знал, как отправить этот параметр. Я попробовал использовать шаблон html, отправив параметр «q» следующим образом: <form action=»{% url ‘wiki:index’ q%}» method=»post»> И в функции Django у меня есть: title = запрос. POST [«q»] Но ошибка всегда одна и та же.
5. Я прочитал, что из шаблона html необходимо отправить параметр следующим образом (word1.word2), например: person.id , или что это должно быть что-то вроде следующего:=»post»> Вы знаете, как создать этот параметр или если необходимо что-то дополнительное в коде Django?