【问题标题】:How do I pass the results of a user submitted html form to django urls?如何将用户提交的 html 表单的结果传递给 django url?
【发布时间】:2014-04-05 01:07:18
【问题描述】:

我的搜索过滤器有一个 Django Url 模式,如下所示:

url(r'^search/(?P.+)$', views.search, name='search'),

这样,如果我调用 /search/1+Timothy,URL 会转到我的搜索视图,该视图会返回我的查询结果 - 在本例中,是 1 Timothy 中的所有条目。到目前为止,一切顺利。

在我的页面中,我想添加一个对该搜索功能的简单调用。所以,我想,为什么不是简单的形式呢?

    <FORM method='GET' action='/search/'>
        <!-- Note: Calls /search?filter_range=entered_reference is handled in urls.py-->
        <LABEL for="filter_range">Show References</LABEL>
        <INPUT id='filter_range' name='filter_range' type='text' placeholder='search' value='' />
        <INPUT type='submit' />
    </FORM>

应该等于简单的:

http://127.0.0.1:8000/search/?filter_range=1+timothy

问题是,我不知道如何在 urls.py 中指定:

url(r'^search/\\?passage=(?P<filter_range>.+)$', views.search, name='search'),
url(r'^search/(?P<filter_range>.+)$', views.search, name='search'),

不起作用,我似乎也想不出一个可以起作用的正则表达式。那么,如何让模板中的表单输出回调到 urls.py 可以找到的 url?

【问题讨论】:

  • 是的,在有人问之前,我已经尝试过 search?filter_range 了.. :)
  • 据我所知,您不能使用 GET 作为表单方法来使用命名参数/url 段。这些值将作为值附加到查询字符串:?foo=bar。您只需指向您的基本视图 URL 模式,然后从 request.GET.get('your-param') 中获取值

标签: regex django django-urls


【解决方案1】:

您不必担心 URL 中的 GET 参数。

试试这个:

url(r'^search/$', views.search, name='search'),

在视图中

def search():
    filter_range = request.GET.get('filter_range', '')
    #rest of the code.

您可以灵活地发送任意数量的 GET 参数,而无需在 urls.py 中声明它们

this documentation 此处提供更多上下文

【讨论】:

    【解决方案2】:

    您无法通过 urlconfs 检索查询参数。它们可以通过在 django 视图中始终可用的 request 对象来访问。示例:

    request.GET.get('searchvalue')
    

    更多详情请关注https://docs.djangoproject.com/en/dev/ref/request-response/

    【讨论】:

    • 没有。使用request.GET 会是 +1,但说搜索表单应该是 POST 是完全错误的。 POST 用于修改数据的操作:搜索不这样做。您甚至可能想要为搜索结果添加书签,而您只能使用 GET。
    • 感谢您指出这一点,您是对的。我将编辑我的答案。
    【解决方案3】:

    作为一个小的跟进,这正是我能够在适当位置重用我的函数的方式:

    来自views.py

    def search(request, filter_range):
        search_ref = BibleReference(filter_range)
        qry_in_range = "SELECT * FROM concordance_reference WHERE ref_book_num=%s AND ref_endchapter_num >= %s AND ref_endverse_num >= %s AND ref_startchapter_num <= %s AND ref_startverse_num <= %s ORDER BY ref_book_num, ref_startchapter_num, ref_startverse_num, ref_endchapter_num, ref_endverse_num"
        params = tuple([search_ref.book_num, search_ref.start_chapter, search_ref.start_verse, search_ref.end_chapter, search_ref.end_verse]) 
    
        found_references_list = VerseReference.objects.raw(qry_in_range, params)
    
        template = loader.get_template('concordance/index.html')
        context = RequestContext( request, {
            'filter_range': filter_range,
            'filter_ref': search_ref,
            'found_references_list': found_references_list,
            })
        return HttpResponse(template.render(context))
    
    def empty_search(request):
        filter_range = request.GET.get('filter_range', '')
        return search(request, filter_range)
    

    网址.py

    url(r'^search/$', views.empty_search, name='empty_search'),
    url(r'^search/(?P<filter_range>.+)$', views.search, name='search'),
    

    这种方法的优点是我的宁静网址: /search/1+Timothy 保持良好状态,并且 /search/?filter_range=1+Timothy 仍然可以从我的表单中调用。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2012-10-18
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 2017-09-06
      相关资源
      最近更新 更多