Python 如何从表单提交中获取输入并使用django显示条目

Python 如何从表单提交中获取输入并使用django显示条目,python,django,forms,Python,Django,Forms,我试图从Django中的表单中获取输入,然后搜索存储并显示任何匹配项,这是我目前为止的代码 views.py def search(request): input = request.GET.get('q') return render(request, "encyclopedia/search.html", { "entry": util.get_entry(input) == None, "di

我试图从Django中的表单中获取输入,然后搜索存储并显示任何匹配项,这是我目前为止的代码

views.py

def search(request):
    input = request.GET.get('q')
    return render(request, "encyclopedia/search.html", {
        "entry": util.get_entry(input) == None,
        "display": util.get_entry(input)
    })
urlpatterns = [
    path("", views.index, name="index"),
    path("<str:name>", views.entry, name="entry"),
    path("search", views.search, name="search")

]
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
search.html

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

    {% block title %}

    {% endblock %}

    {% block body %}



        {% if entry %}
            <div>No entry found</div>
        {% else %}
            <div>{{ display }}</div>
        {% endif %}


        {% endblock %}
    <div class="row">
            <div class="sidebar col-lg-2 col-md-3">
                <h2>Wiki</h2>
                <form action="{% url 'search' %}" method="get">

                    <input class="search" type="text" name="q" placeholder="Search Encyclopedia">
                    <input type="submit">
                </form>
                <div>
                    <a href="{% url 'index' %}">Home</a>
                </div>
                <div>
url.py

def search(request):
    input = request.GET.get('q')
    return render(request, "encyclopedia/search.html", {
        "entry": util.get_entry(input) == None,
        "display": util.get_entry(input)
    })
urlpatterns = [
    path("", views.index, name="index"),
    path("<str:name>", views.entry, name="entry"),
    path("search", views.search, name="search")

]
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
它可以将您带到搜索页面,但始终显示未找到的条目,即使该条目确实存在

这是我第一个使用Django的项目,所以它非常新,我假设在如何将表单输入提供给
util.get\u entry()
函数方面存在问题

在阅读了Django中的表单文档之后,我似乎仍然找不到任何关于如何使其工作的参考资料。任何帮助都将不胜感激

在进一步挖掘之后,我发现
views.py中的行

def search(request):
    input = request.GET.get('q')
    return render(request, "encyclopedia/search.html", {
        "entry": util.get_entry(input) == None,
        "display": util.get_entry(input)
    })
urlpatterns = [
    path("", views.index, name="index"),
    path("<str:name>", views.entry, name="entry"),
    path("search", views.search, name="search")

]
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
input=request.GET.GET('q')


每次都为变量赋值“search”,而不是用户表单输入。

Django按顺序搜索
urlpatterns

如果您的
url.py
如下所示

urlpatterns=[
路径(“,views.index,name=“index”),
路径(“,views.entry,name=“entry”),
路径(“搜索”,views.search,name=“搜索”)
]
那么这条线

path(“,views.entry,name=“entry”)

告诉django匹配任何url,该url是指向
views.entry
函数的字符串。因为它是以前的

path(“search”,views.search,name=“search”)

当url
/search
进入时,它将始终指向
视图。条目
,因为它与
'search'
匹配,将在该视图功能中分配给
名称

#假设您的函数如下所示
def条目(请求、名称):
...
实际上,
search.html
页面从未被加载,因此每次都会看到
entry.html
。这可能是不明显的,因为您说过这两个页面具有相同的html

代码

def搜索(请求):
input=request.GET.GET('q')
返回呈现(请求“encyclopedia/search.html”{
“条目”:util.get_条目(输入)=无,
“显示”:util.get_条目(输入)
}) 
永远都不会被运行

为了解决这个问题,只需交换urlpatterns中的路径,这样
search
就会排在第一位,就像这样

urlpatterns=[
路径(“,views.index,name=“index”),
路径(“搜索”,views.search,name=“搜索”),
路径(“,views.entry,name=“entry”)
]
还有。。。一件小事,但我会将
input
重命名为其他类似
form\u input
input
是一个内置的python函数,您将用查询字符串覆盖它


还有。。建议您将
{%if entry%}
重命名为
{%if no_entry%}
或类似名称。它在逻辑上读起来更好,特别是当其他人正在使用您的代码时。再说一次,只是建议

您能为
entry.html
添加html吗。如果我能猜一猜的话,我会说它与
search.html
非常相似?我想我知道发生了什么,但我想确定一下。是的,它与entry完全相同。htmlok我完全知道发生了什么事情解决了这个问题非常感谢我会采纳你的建议谢谢你,不用担心。快乐编码!