Django URLS,使用?在URL中

时间:2012-08-22 18:46:20

标签: regex django urlconf

我正在尝试进行一些Django URL匹配。

我想要一些网址,其中包含http://mysite.com/base?sort=type1/http://mysite.com/base?sort=type2/等。

我无法弄清楚如何对这些表达式进行URL匹配:我是Django的新手,之前从未使用过Reg Ex。

我在“基础”应用程序中对urls.py所拥有的是:

url(r'^$','base.views.main, name='main'),

我无法弄清楚要将问号与我的网址匹配的内容。

我正在尝试像

这样的东西
url(r'^?sort=popular/$', 'base.views.main_popular', name='main_popular'),

感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

你不能将这些与正则表达式相匹配。 ?后面的元素不属于网址,它们是查询参数,可以通过request.GET从您的视图中访问。

答案 1 :(得分:6)

?不符合“?”在网址内,相反它有自己的含义,你可以在这里查找:
Python Regular Expressions 如果你想匹配“?”的确切字符在你的网址中,你必须以某种方式逃避它(因为它在RegExs中有意义)所以你可能想通过“\”(反斜杠)来逃避它 所以你会写\?sort ....

编辑:
好的,你在评论中说过,看来这是你的问题,当你使用main?sort=popular方法字典参数{/main/呈现GET的模板时,你的网址模式会出现sort=popular {1}},只需编写一个区分GETPOST的函数,在GET部分,有sort_by = request.GET.get('sort',''),然后使用sort_by的值进行排序变量,就像是:

def main_handler(request):
     if request.method == "POST":
           whatever ... 
     if request.method == "GET" :
           sort_by = request.GET.get('sort','')
           if sort_by:
                 sort by what sort points to 
                 return "the sorted template"
     return render_to_response(the page and it's args)

然后放手吧?在url模式中,当你请求带有GET参数的页面时,它会被添加。

答案 2 :(得分:0)

您不需要这样做。相反,您可以制作一个通用的模板并查看。

#And this is the views.py
def main_handler(request):
    if request.method == "GET":
        sort_parameter = request.GET.get('sort')
        if sort_parameter:
             #the code to sort the database objects on basis of the sort parameter
             return render(The template and its kwargs)
        #your other code

您的url文件应如下所示:

urlpatterns = [
url(r'base/', 'base.views.thecommonview', name='main'),
]