【问题标题】:how to take input from form submission and use it to display an entry using django如何从表单提交中获取输入并使用它来使用 django 显示条目
【发布时间】:2021-01-21 17:10:02
【问题描述】:

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

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

【问题讨论】:

  • 您能否包含entry.html 的html。如果我能猜一下,我会说它与search.html非常相似?
  • 我想我知道发生了什么,但我想确定一下。
  • 是的,它与 entry.html 完全相同
  • 好的,我知道发生了什么

标签: python django forms


【解决方案1】:

Django 按顺序搜索urlpatterns

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

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

]

然后这一行

path("&lt;str:name&gt;", views.entry, name="entry")

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

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

当 URL /search 进入时,它将始终被定向到 views.entry,因为它确实匹配
"&lt;str:name&gt;" 并且 '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")
    

]

还有...一件小事,但我会将input 重命名为form_input 之类的其他名称。 input 是一个内置的 Python 函数,您将使用查询字符串覆盖它。

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

【讨论】:

  • 是的,解决了这个问题,非常感谢,我会采纳你的建议再次感谢
  • 不用担心。编码愉快!
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 2018-02-09
  • 1970-01-01
  • 2012-03-16
  • 2023-03-02
  • 1970-01-01
  • 2016-10-31
  • 2015-02-06
相关资源
最近更新 更多