【问题标题】:Search input on every page. Django在每一页上搜索输入。姜戈
【发布时间】:2012-04-26 06:21:24
【问题描述】:

我有一个关于 Django 的网站。 我想在每个页面上创建一个搜索输入。 在一些“base.html”中我为这个搜索输入写了新的。

在views.py中我添加了类似的内容:

def main(request):
    if request.method == 'POST':
        search_string = request.POST['search_string']
        result = search(search_string)
        return direct_to_template(request, 'found_page.html', {'result': result})`

但我希望它出现在每一页上。

因此,我创建了新函数“search_function(request)”并将其添加到 views.py 中的每个 def 中。 或者我可以创建一个装饰器并在views.py中的每个def之前编写它。

我不想每次添加新定义时都这样做。 但我不知道怎么做。 需要你的帮助

【问题讨论】:

  • 也许您可以使用middleware解决您的问题

标签: python django search


【解决方案1】:

所以这就是我认为你想要做的:在每个页面上显示一个搜索输入表单(以适用者为准),并且只使用一个视图来处理搜索。

  1. 创建一个处理搜索的视图
  2. 创建一个 html 页面,其中包含搜索的 <form> 元素,其操作将转到您在上一步中完成的视图
  3. 在您的 base.html 中包含或扩展它

我不明白的是,您需要搜索恰好是本地页面上的搜索吗? (例如,在本论坛内搜索)

要获取查询,您可以通过request.GET['q']request.POST['q'] 或类似方式提供查询。

def search(request):
  if 'q' in request.GET and request.GET['q']:
     // do something

除非您的搜索(查询)更改了数据库中查询结果的状态,否则您不想使用POST。请改用GET

【讨论】:

  • 谢谢。
    中的“动作”。我完全忘记了。
  • @user1185123 没问题。使用GET 而不是POST。在查询(搜索)时创建新资源是一种浪费。希望这会有所帮助!
  • 资源?我不明白为什么 get 比在这种情况下发布更好
  • 真正古老的约定是,如果您的搜索没有修改您正在检索的数据(例如,只需查询用户拥有多少书签),请使用 GET。如果您的查询修改了某些内容(例如:查询名为“哈利波特”的书签并将结果列表保存到用户的书签列表中),则使用 POST。这是微妙的事情。在很多情况下这并不重要,但这是一个很好的做法。如果您更喜欢POST,那很好:) 业内人士使用此约定。还有PUT,类似POST,修改数据,但不创建资源。
  • 谢谢。不知道这件事。现在会更频繁地使用 GET)
【解决方案2】:

将表单的操作设置为转到不同的搜索视图,并让该函数负责搜索处理。您可以有一个专门的搜索页面,并执行完全相同的操作来检查表单是“POST”还是“GET”。 'POST' 是已经从任何其他上一页完成的搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多