Как мне обработать в Django отправку текста с помощью метода «Post» или «GET» из HTML?

#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?