python - 如何从表单提交中获取输入并使用它来使用 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')
每次都为变量分配“搜索”的值,而不是用户表单输入。
解决方案
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")
]
也......一件小事,但我会重命名input
为form_input
. input
是您使用查询字符串覆盖的内置 python 函数。
也..只是一个建议,重命名{% if entry %}
或{% if no_entry %}
类似的东西。它在逻辑上读起来更好,特别是如果其他人将使用您的代码。再次,只是建议!
推荐阅读
- firebase - 在 watchOS Swiftui 画布上构建时如何解决来自 Firebase 的 Xcode 错误
- html - 引导警报按钮设计已关闭,单击时不会关闭
- swift - 使用 onDisconnectUpdateChildValues 时如何读写 - firebase swift
- sql - 如何解决此访问被拒绝错误?
- python - Python - 如何在 3 列上组合两个数据框并保留两个数据框中的列?
- botframework - Bot Framework & MS Teams - 为什么查询类型消息扩展的按钮不可见?
- ios - 如何在 Socket.IO-Client-Swift 的 SocketManager 中设置选项或配置?
- html - 为什么我得到一个意想不到的图像底部空间
- dynamics-crm - Microsoft Dynamics API - Incident returned fields
- android - Cannot ping an added host into /etc/hosts - Android Issue