Python 用Django实现搜索表单

Python 用Django实现搜索表单,python,django,Python,Django,大家好,我的社区 我的表格不能用Django呈现,有问题 下面是我在views.py中呈现空表单的尝试 类搜索站点(forms.Form): query=forms.CharField(label=“New Item”, help_text=“搜索网站上的任何文章。”) def搜索(请求): 表单=搜索站点() 上下文={ “形式”:形式, “查询匹配”:查询匹配 } 响应=呈现(请求,“encyclopedia/layout.html”,上下文) 返回响应 下面是我的url.py文件的外

大家好,我的社区

我的表格不能用Django呈现,有问题

下面是我在
views.py
中呈现空表单的尝试


类搜索站点(forms.Form):
query=forms.CharField(label=“New Item”,
help_text=“搜索网站上的任何文章。”)
def搜索(请求):
表单=搜索站点()
上下文={
“形式”:形式,
“查询匹配”:查询匹配
}
响应=呈现(请求,“encyclopedia/layout.html”,上下文)
返回响应
下面是我的
url.py
文件的外观:

urlpatterns=[
路径(“,views.index,name=“index”),
路径(“wiki/”,views.page,name=“wiki”),
路径(“wiki/”,views.search,name=“site\u search”)
]
我的
layout.html
文件:

{%load static%}
{%block title%}{%endblock%}
维基
{%csrf_令牌%}
这里应该有东西
{{form}}
创建新页面
随机页面
{%block nav%}
{%endblock%}
{%block body%}
{%endblock%}
我注意到上面截图中有两个特别的问题。首先,我的表单在
index.html
网页中不呈现,该网页扩展了
layout.html
。其次,当我点击submit按钮时,我会被发送到一个在url中有我的CSRF令牌的网页。。。然后最后呈现我的表单

我怎样才能解决这个问题?谢谢大家

我注意到上面截图中有两个特别的问题。首先, 我的表单在我的
index.html
网页中不呈现,这 扩展
layout.html

对。您没有将
表单
传递到
index.html
。在呈现主页的视图中传递。即使它是从
layout.html
扩展而来,也需要在上下文中传递它才能工作

def索引(请求):
#你的密码。
返回呈现(请求'index.html',{'form':SearchSite()})
第二,当我点击提交按钮时,我会被发送到一个网页 在url中有我的CSRF令牌。。。最后,我的 形式


这是因为,在
index.html
中,有一个空白表单,带有
csrf\u标记
,其操作设置为
/wiki
,按下提交按钮时调用
搜索
。而
search
将为您提供
layout.html
,以及表单,由于表单方法是
GET
,它将在url中显示它。如果有机密数据,我建议将其更改为
POST
(甚至其他。如果不是POST请求,为什么会有
csrf\u令牌
?不需要。如果您确实想要GET请求,那么请删除
csrf\u令牌
)。

这是我之前为将来访问该帖子的人提出的问题的解决方案

我编写了一个名为
SearchSite
的表单,并在我的
views.py
中定义了一个名为
search
的视图

类搜索站点(forms.Form):
query=forms.CharField(
help_text=“搜索网站上的任何文章。”)
def搜索(请求):
表单=搜索站点()
是\u查询的\u子字符串\u=[]
如果request.method==“GET”:
表单=搜索站点(request.GET)
如果form.is_有效():
对于util.list_entries()中的条目:
ExistSideEnticalResult=form.cleaned_数据[“查询”].casefold()==entry.casefold()
existsResult=entry.casefold()中的form.cleaned_data[“query”].casefold()
如果存在实体结果:
返回HttpResponseRedirect(反向(“wiki”),
kwargs={“页面标题:条目}”)
elif现有结果:
是\u查询的\u子字符串\u.append(条目)
上下文={
“表单”:SearchSite(),
“is_substring_of_查询”:is_substring_of_查询
}
response=render(请求,“百科全书/search.html”,上下文)
返回响应
当请求my
view.search
时,它将发送一个空表单的响应(如果通过
index.html
访问,或者如果没有结果,则会显示一条消息说没有结果),空表单和作为标记项的子字符串的所有查询,或者如果查询匹配,则将客户端路由到精确的项

以下是迄今为止我的
url.py
中的路由:

urlpatterns=[
路径(“,views.index,name=“index”),
路径(“wiki/”,views.page,name=“wiki”),
路径(“search/”,views.search,name=“site\u search”)
]
在我的
layout.html
中,我有以下表格:


{{form}}
以及my search.html中作为标记项子字符串的查询:

{%if是\u查询%的\u子字符串\u}
搜索结果
{for query中的查询%is\U substring\U of\U QUERES%}
  • {%endfor%} {%else%} 没有结果!再试一次。 {%endif%}

    如果有任何错误,请告诉我。

    我认为这与/route调用views.index函数有关,而不是views.search函数,因此它永远不会在主页上显示表单。谢谢。拥有csrf_代币是一个愚蠢的错误。所以澄清一下,如果我计划使用我的搜索将我重定向到搜索页面,我应该使用get,因为没有机密数据?获取请求