首页 > 解决方案 > 如何使用 django 在 url 中添加问号?

问题描述

我有:

urlpatterns = [
    url(r'^tools(?:/tool_one=(?P<tool_one>\w+))?/?$', views.ToolsViews.as_view(), name='tools'),
]


url的打印是这样的:

工具/tool_one=包


我想在 url 中添加一个问号,如下所示:

工具/?tool_one=包


我试着写:

urlpatterns = [
        url(r'^tools(?:/\?tool_one=(?P<tool_one>\w+))?/?$', views.ToolsViews.as_view(), name='tools'),
    ]

但问号不存在,url的打印:

工具/%3Ftool_one=包

谁能给我一些提示?问题是什么?

标签: pythonregexdjangourldjango-rest-framework

解决方案


您在这里描述的是querystring。Django URL处理查询字符串。但是,您可以通过request.GET基于函数的视图或self.request.GET基于类的视图访问查询字符串的数据。

request.GET是一个QueryDict。它就像一个字典(除了它是不可变的,而且一个键可以映射到多个值)。

因此,您可以获得tool_onewith的值self.request.GET['tool_one'](与查询字典的方式相同)。

由于这不是 Django url 的一部分,因此该urls.py文件如下所示:

#  app/urls.py

urlpatterns = [
    url(r'^tools/$', views.ToolsViews.as_view(), name='tools'),
]

然后,您可以在视图中使用它进行过滤,例如:

class ToolsViews(ListView):
    model=Tool

    def get_queryset(self):
        if 'tool_one' in self.request.GET:
            return Tool.objects.filter(one=self.request.GET['tool_one'])
        return Tool.objects.all()

最后,您可以使用以下模板在模板中构建此类 URL:

<a href="{% url 'tools' %}?tool_one=foo">Link</a>

<form>或者通过使用方法编写一个"get"

<form action="{% url 'tools' %}" method="get">
  Tool one: <input type="text" name="tool_one"><br>
  <input type="submit" value="Submit">
</form>

然后这种形式method="get"会将文本框中的值转换为查询字符串。


推荐阅读