【问题标题】:Django, creating a functional search bar and search results pageDjango,创建功能搜索栏和搜索结果页面
【发布时间】:2018-02-03 22:57:04
【问题描述】:

我在使用继承代码制作功能搜索栏时遇到问题。我在正确创建 search_results 页面时遇到了最大的麻烦。

我将我的 search_results 页面精简为只有一行。 search_results.html<div>You searched for {{ query }}</div> 但现在,search_results 页面没有呈现 {{ query }}。不会出现用户先前输入的文本。该页面上显示的所有内容都是“您搜索过”

searchbox.html

<form class="search" action="{% url 'search' %}" method='post'>
  {% csrf_token %}
  <input type="search" placeholder="Search here..." name="usr_query" 
      value='{{ query }}' required>
  <button type="submit">Search</button>
</form>

views.py

def search(request):
  query = request.POST['usr_query']
  print "QUERY: "
  print query
  t = loader.get_template('gtr_site/test_search_results.html')
  c = Context({ 'query': query,})
  return HttpResponse(t.render(c))

我有点谨慎并添加了“打印”语句......它确实打印出了用户在搜索栏中输入的内容。但这不是在我的 search_results 页面上生成的。

这是什么原因?

编辑:

添加 urls.py

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^about/$', views.about, name='about'),
    url(r'^contact/$', views.contact, name='contact'),
    url(r'^search_engine/$', views.statement_search_engine, name='statement-search') # <- url for searchbox.html,
    url(r'^test_search_results/$', views.search, name='test-search'), # <- url for searchresults.
    url(r'^(?P<statement_id>.+)/$', views.statement_page, name='statement'),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

【问题讨论】:

    标签: python html django


    【解决方案1】:

    您的 Searchbox.html 方法是“发布”而不是“获取”

    <form class="search" action="{% url 'search' %}" method='get'>
         {% csrf_token %}
         <input type="search" placeholder="Search here..." name="usr_query" 
            value='{{ query }}' required>
         <button type="submit">Search</button>
    </form>
    

    views.py

    class search(ListView):
        model = YourModel #The model model you want to search
        template_name = 'gtr_site/test_search_results.html'
    
    
        def get_queryset(self):
       
            query = self.request.GET.get('usr_query')
            object_list = YourModel.objects.filter(modelfield__icontains=query)
            return object_list
    

    在你的网页中可能index.html你应该添加return。

      {% for result in object_list %} 
        {{ result.name }}   
      {% endfor %}
    

    【讨论】:

      【解决方案2】:

      简答:

      好像是这样溜过去的:

      c = Context({ 'query': query,})

      这是在views.py 中。 Context() 不会导致任何错误消息,但是...为了获得所需的功能,我所要做的就是删除此函数并将 c 变量设为常规字典。

      由于这个 stackoverflow 问题Writing a very basic search form in Django,我包含了 Context 函数

      【讨论】:

      • 我自己从未使用过 Context() 函数,但我查了一下,似乎您使用正确。但请注意,如果您不将 {{ request.GET.usr_query }} 更改为 {{ query }},它仍然无法正常工作。
      【解决方案3】:

      value='{{ request.GET.usr_query }}' 更改为value="{{ query }}"

      现在您正在强制它显示 GET 参数。这适用于初始页面加载(通常是 GET),但此时您还没有进行任何搜索。您将搜索(在我看来是正确的,但值得商榷)作为 POST 提交。搜索函数使用 POST 参数并在上下文中返回 query,这是正确的。但随后您显示 usr_query 的 GET 值——此时该值不存在,因为该页面现在是 POST 页面。更改value=,它应该可以工作。

      【讨论】:

      • 根本不同意这种方法。 POST 请求用于更改服务器上的数据的操作。 GET 是用于搜索的正确方法,它是关于请求特定的数据子集。另外,可以为 GET 添加书签。
      • 感谢您的解释,因为我实际上不理解 GET 和 POST 以及我应该......这是一个继承的项目。我只是尽可能地保持相同。不幸的是,将 value 属性更改为您所说的无效。 search_results 页面仍然没有显示任何内容。我什至尝试更改为 {{ usr_query }} ,但是……那没有用。
      • @DanielRoseman 正如我所说,这是值得商榷的。但无论你以哪种方式做事,你都必须让代码、上下文、模板都匹配。
      • @ByronSmith {{ usr_query }} 不适用于当前代码。您需要从上下文进行映射。您的调试print 行是否正确显示查询?
      • urls.py 中的任何代码是否会产生影响?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      相关资源
      最近更新 更多