Как искать методом POST в Django - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь отобразить страницу результатов поиска. Если запрос найден, он будет перенаправлен на страницу ввода. В противном случае, если подстрока запроса будет найдена, отобразится страница результатов поиска с записью, показанной в виде ссылки, и если щелкнуть эту ссылку, отобразится страница ввода. Вот мой код, как показано ниже, пожалуйста, помогите:

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: Когда я выполнял поиск, он всегда показывает страницу с ошибкой. Зачем? Я указал аргументы функции входа, но, похоже, она не получает правильный аргумент.

Ответы [ 4 ]

0 голосов
/ 11 августа 2020
    from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("wiki/<str:title>", views.mdpage, name="entry"),
    path("createpage",views.create, name="create"),
    path("wiki/edit/<str:title>", views.edit, name="edit"),
]
0 голосов
/ 04 августа 2020

Я знаю ответ на Q3: порядок, в котором создаются URL-адреса в urls.py.

Django будет искать путь сверху вниз, поэтому он останавливается на функции входа как второй и не попал в путь поиска ниже. Я изменил порядок, и при поиске больше не отображается страница с ошибкой. Хотя поиск по-прежнему не работает. С этим нужна помощь.

0 голосов
/ 04 августа 2020

Решил функцию поиска с помощью Ральфа Борги, теперь поиск по словам и подстрокам работает.

Это должен быть метод GET, единственная проблема меня застряла в том, что я не знал, как сделать URL-адрес выглядит как "/ wiki / CSS", например, без шаблона? q =. Код ниже для всех, кто интересуется:

def search(request):
    # get search input from user
    search_entry = request.GET['q']
    # results = list()

    # get entries list
    entries = util.list_entries()
    rand = random.choice(entries)
    # search list
    results = []
    
    # try to search if there is such entry in entries
    if request.method == "GET":
        if search_entry in entries:
            return HttpResponseRedirect("/wiki/" + request.GET.get("q"))
        
        else: 
            for entry in entries: 
                if search_entry in entry: 
                    results.append(entry)
                    return render(request, "encyclopedia/search.html", {
                        "results": results,
                        "random": rand
                    })
urlpatterns = [
    path("", views.index, name="index"),
    path("create", views.create, name="create"),
    path("search", views.search, name="search"),
    path("edit/<str:title>", views.edit, name="edit"),
    path("<str:title>", views.entry, name="entry")
]
0 голосов
/ 03 августа 2020
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django import forms


from . import util
import markdown2

class NewEntryForm(forms.Form):
    title = forms.CharField(max_length=100)
    content = forms.CharField(widget=forms.Textarea)


class EditForm(forms.Form):
    title = forms.CharField(max_length=100, initial='title')
    Edit_Content = forms.CharField(widget=forms.Textarea, initial='content')



def index(request):
    if util.get_entry(request.GET.get("q")) is not None:
        return HttpResponseRedirect("/wiki/" + request.GET.get("q"))
    
    return render(request, "encyclopedia/index.html", {
        "entries": util.list_entries()
    })
    

def mdpage(request, title):
    if util.get_entry(request.GET.get("q")) is not None:
        return HttpResponseRedirect("/wiki/" + request.GET.get("q"))
    conversion = markdown2.markdown(util.get_entry(title))
    return render(request, "encyclopedia/mdpage.html", {
        "mdconvert" : conversion
    })

def create(request):
    if request.method == "POST":
        NewEntry = NewEntryForm(request.POST)
        if NewEntry.is_valid():
                title = NewEntry.cleaned_data['title']
                content = NewEntry.cleaned_data['content']
                if (title in util.list_entries()):
                    return HttpResponse ("Error Entry already exists")
                else:    
                    util.save_entry(title, content)
                    return render(request, "encyclopedia/index.html", {
                    "entries": util.list_entries()
                    })
        else:
            return render(request, "encyclopedia/createpage.html", {
             "NewEntry": NewEntry
            })
    else:
        return render(request, "encyclopedia/createpage.html", {
            "NewEntry": NewEntryForm()
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...