在 Django 中创建导航栏搜索框的最佳方法是什么?

发布于 2024-08-08 20:44:01 字数 1023 浏览 7 评论 0原文

我希望将一个搜索框集成到显示在每个页面顶部的导航栏中(嘿,在此 StackOverflow 页面顶部有一个我正在谈论的示例)。

也许 nav.html 可能看起来像:

<ul id="menu">
    <li><a href="/products"></li>
    <li><a href="/service"></li>
    <li>{{ nav_search_form.as_p }}</li>
</ul>

也许 forms.py 可能包含:

class NavSearchForm(forms.Form):
  query = forms.CharField(max_length=30, required=False)

根据 DRY 原则,我不希望views.py 在每个页面上寻找“查询”,例如:

def ProductsPage(request):
    search_form = NavSearchForm()
    if request.GET.has_key('query'):
        query = request.GET['query'].strip()
    # deal with 'Products' here...

def ServicePage(request):
    search_form = NavSearchForm()
    if request.GET.has_key('query'):
        query = request.GET['query'].strip()
    # deal with 'Service' here...

我已经并且可以轻松地编写一个页面,该页面将处理搜索查询并显示结果。如何最好地提取搜索词并将用户定向到该搜索页面(返回 HttpResponseRedirect('/results/?query=' + query))而不剥离每个页面上的 request.GET?

I would like to have a search box integrated into a nav bar that appears on the top of each page (hey, there is an example of what I am talking about up there at the top of this StackOverflow page).

Perhaps the nav.html may look like:

<ul id="menu">
    <li><a href="/products"></li>
    <li><a href="/service"></li>
    <li>{{ nav_search_form.as_p }}</li>
</ul>

Perhaps forms.py may contain:

class NavSearchForm(forms.Form):
  query = forms.CharField(max_length=30, required=False)

With the DRY principle I do not want views.py to be looking for a 'query' on every page like:

def ProductsPage(request):
    search_form = NavSearchForm()
    if request.GET.has_key('query'):
        query = request.GET['query'].strip()
    # deal with 'Products' here...

def ServicePage(request):
    search_form = NavSearchForm()
    if request.GET.has_key('query'):
        query = request.GET['query'].strip()
    # deal with 'Service' here...

I have and can easily program a page that will handle the search query and show results. How do you best extract the search terms and direct the user to that search page (return HttpResponseRedirect('/results/?query=' + query)) without stripping the request.GET on every page?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

携君以终年 2024-08-15 20:44:01

只需让搜索表单对您的常用搜索 URL 执行 GET 操作即可。

<form action="/search/" method="get">
...
</form>

如果您不想硬连线 URL,请使用 URL 反向查找工具...

<form action="{% url my-search-view %}" method="get">
...
</form>

除非我误解了这个问题,否则听起来您可能认为表单必须获取/发布到加载当前页面的同一 URL。

Just have the search form do a GET on your common search URL.

<form action="/search/" method="get">
...
</form>

Use the URL reverse lookup facility if you don't want to hardwire the URL...

<form action="{% url my-search-view %}" method="get">
...
</form>

Unless I misunderstood the question, it sounds like maybe you were thinking that forms have to get/post to the same URL that loaded the current page.

人疚 2024-08-15 20:44:01

我们在其中一个网站上使用 Google CSE,它非常简单。您可以打开一些功能,但这很简单,并且您可以获得所有标准的 Google Goodness™。

We use a Google CSE on one of our sites and it's about as straightforward as you can get. There are a couple of features you can turn on, but it's trivial and you get all the standard Google Goodness™.

青芜 2024-08-15 20:44:01
  1. 正如 Joe Holloway 建议的那样,使用单独的视图。
  2. 使用表单的力量

    def ProductsPage(请求):
        search_form = NavSearchForm(请求.GET)
        如果 search_form.is_valid():
            ....
    
  1. Use separate view as Joe Holloway suggests.
  2. Use forms power

    def ProductsPage(request):
        search_form = NavSearchForm(request.GET)
        if search_form.is_valid():
            ....
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文