首页 > 解决方案 > 如何从表单提交中获取输入并使用它来使用 django 显示条目

问题描述

我正在尝试从 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)
    })

search.html

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

    {% block title %}

    {% endblock %}

    {% block body %}



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


        {% endblock %}

layout.html

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

urls.py

urlpatterns = [
    path("", views.index, name="index"),
    path("<str:name>", views.entry, name="entry"),
    path("search", views.search, name="search")

]

utils.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

它可以将您带到搜索页面,但即使条目确实存在,也始终显示未找到条目。

这是我第一个使用 Django 的项目,所以它很新,我假设我如何将表单输入提供给util.get_entry()函数存在问题。

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

经过一些进一步的挖掘,我发现这条线views.py

input = request.GET.get('q')

每次都为变量分配“搜索”的值,而不是用户表单输入。

标签: pythondjangoforms

解决方案


Djangourlpatterns按顺序搜索。

如果你urls.py看起来像这样

urlpatterns = [
    path("", views.index, name="index"),
    path("<str:name>", views.entry, name="entry"),
    path("search", views.search, name="search")

]

然后这条线

path("<str:name>", views.entry, name="entry")

告诉 django 匹配任何 url,它是要定向到views.entry函数的字符串。因为是之前

path("search", views.search, name="search")

当 url/search进入时,它将始终被定向到,views.entry因为它确实匹配
"<str:name>"并将在该视图函数'search'中分配给name

# assuming your function looks something like this
def entry(request, name):
    ...

search.html页面实际上从未被加载,因此您实际上entry.html每次都看到。这可能并不明显,因为您已经说过这两个页面具有相同的 html。

编码

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 中的路径,这样就可以了search,就像这样。

urlpatterns = [
    path("", views.index, name="index"),
    path("search", views.search, name="search"),
    path("<str:name>", views.entry, name="entry")
    

]

也......一件小事,但我会重命名inputform_input. input是您使用查询字符串覆盖的内置 python 函数。

也..只是一个建议,重命名{% if entry %}{% if no_entry %}类似的东西。它在逻辑上读起来更好,特别是如果其他人将使用您的代码。再次,只是建议!


推荐阅读