我正在尝试进行一些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'),
感谢您的帮助!
答案 0 :(得分:7)
你不能将这些与正则表达式相匹配。 ?
后面的元素不属于网址,它们是查询参数,可以通过request.GET
从您的视图中访问。
答案 1 :(得分:6)
?不符合“?”在网址内,相反它有自己的含义,你可以在这里查找:
Python Regular Expressions
如果你想匹配“?”的确切字符在你的网址中,你必须以某种方式逃避它(因为它在RegExs中有意义)所以你可能想通过“\”(反斜杠)来逃避它
所以你会写\?sort ....
编辑:
好的,你在评论中说过,看来这是你的问题,当你使用main?sort=popular
方法字典参数{/main/
呈现GET
的模板时,你的网址模式会出现sort=popular
{1}},只需编写一个区分GET
和POST
的函数,在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'),
]