在 Django 中制作搜索栏

Making search bar in django

我试图在 django 中创建一个搜索栏,并观看了几个 youtube 教程,其中 none 有效。我想做的是制作一个重定向到 articles/what_you_searched_for 的搜索栏,或者如果不可能显示包含搜索的结果。如果有人有足够的时间,他们可以告诉我如何做到这两点 :)。 在 views.py:

def index(request):
    queryset = article.objects.all()
    number_of_records = article.objects.count()
    random_page = random.randint(1,number_of_records)
    context = {
        "object_list": queryset,
        "random_page": random_page
    }

#    query = ""
#    if request.GET:
#        query = request.GET['q']
#        context['query'] = str(query)


    entries = util.list_entries()
    return render(request, "encyclopedia/index.html", context)
    #{
        #"entries": util.list_entries(),
        #"random_page": random_page,
    #})
def dynamic_articles_view(request, my_id):
    obj = article.objects.get(id= my_id)
    number_of_records = article.objects.count()
    random_page = random.randint(1,number_of_records)
    context = {
        "object": obj,
        "random_page": random_page
    }
    return render(request, "encyclopedia/article_detail.html", context)

在index.html中:

{% extends "encyclopedia/layout.html" %}

{% block title %}
    Encyclopedia
{% endblock %}

{% block body %}
<h1 id="demo" onclick="add_article()">Article</h1>


    <ul>

        {% for instance in object_list %}
            <li><a href = "http://127.0.0.1:8000/articles/{{instance.id}}/">{{instance.title}}</a></li>
        {% endfor %}

    </ul>

{% endblock %}

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 = "/articles/{{q}}">                         __________EXACTLY HERE ________
                    <input class="search" type="text" name="q" placeholder="Search...">
                </form>
                <div>
                    <a href="{% url 'index' %}">Home</a>
                </div>
                <div>
                    <a href = "/new_article" >Create New Article</a>
                </div>
                <div>
                    <a href = "http://127.0.0.1:8000/articles/{{random_page}}">Random Page</a>
                </div>
                {% block nav %}
                {% endblock %}
            </div>
            <div class="main col-lg-10 col-md-9">
                {% block body %}
                {% endblock %}
            </div>
        </div>
    </body>
</html>

网址:

from django.contrib import admin
from django.urls import include, path
from encyclopedia import views
from encyclopedia.views import index, new_article, dynamic_articles_view
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include("encyclopedia.urls")),
    path('new_article/', new_article),
    path('home/', index, name = 'home'),
    path('articles/<int:my_id>/', dynamic_articles_view, name = 'articless')
]

百科全书网址(其他文件夹):

from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("", views.new_article, name="new_article")
]

如果需要,我会评论模型和表格,但我不想让我的问题太长。

最简单的方法是在模板中添加 GET formsearch 输入,而不设置表单的操作:

<form action="">
    <input type="text" name="search" placeholder="Search by title" value="{{request.GET.title}}">
    <input type="submit" value="Search">
</form>

然后在views.py中得到值。如果给出,则按它过滤:

def dynamic_articles_view(request):
    context['object_list'] = article.objects.filter(title__icontains=request.GET.get('search'))
    return render(request, "encyclopedia/article_detail.html", context)