【问题标题】:Django url pattern - string parameterDjango url 模式 - 字符串参数
【发布时间】:2012-08-07 08:34:39
【问题描述】:

具有数字参数的 Django url 模式是:

url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail')

如果我的 poll_id 不是数字而是字符串,那么正确的语法是什么?

【问题讨论】:

    标签: python regex django


    【解决方案1】:

    如果在 url 中有一个字符串参数,你可以有: 网址如下:

    url(r'^polls/(?P<string>[\w\-]+)/$','polls.views.detail')
    

    这甚至可以让 slug 字符串通过 eg:node-js 等字符串。

    【讨论】:

      【解决方案2】:

      在 2.1 等较新版本的 Django 中,您可以使用

      path('polls/<str:poll_id>', views.polls_detail)
      

      这里给出Django URL dispatcher

      def polls_detail(request,poll_id):
      #process your request here
      

      【讨论】:

      • 有了这个答案,你基本上可以请求'url.com/polls/123'。如何创建一个 url 以便您可以发送请求 'url.com/polls?poll_id=123' ?
      • 只需创建一个带有投票的路径,然后您就可以在查询参数中添加任何内容。
      【解决方案3】:

      取决于你关心的角色。就像the docs 说的那样,\w 会给你一个字母数字字符或下划线。

      【讨论】:

      • 谢谢你!我尝试使用 \s 我不知道它的 \w。再次感谢您。
      【解决方案4】:

      从 Django 2.0 开始,通过添加 slug 符号可以更轻松地处理 URL 中的字符串参数,该符号的使用与 urls.py 中的 int 类似:

      from django.urls import path
      
      urlpatterns = [
          path('something/<slug:foo>', views.slug_test),
      ]
      

      在基于函数或基于类的视图中,您可以像处理任何其他参数一样处理它:

      def slug_test(request, foo):
          return HttpResponse('Slug parameter is: ' + foo)
      

      【讨论】:

      • 如果名称包含下划线,则 slug 类型将不起作用,因为 slug 期望它以连字符分隔。但如果这是你想要的,这是一个很好的答案
      【解决方案5】:

      从 Django 2.0 开始,引入了pathpath 不会在 url 中使用 reg ex,因此它是旧 url 的简化版本

      从 2.0 开始,您可以使用路径,如下所示:

      path('polls/<poll_id>', views.polls_detail)
      

      字符串路径参数不需要明确指定,因为路径参数的默认数据类型是字符串本身。

      参考:https://docs.djangoproject.com/en/2.0/releases/2.0/#whats-new-2-0

      【讨论】:

        【解决方案6】:

        如果您使用的 Django 版本 >= 2.0,则只需如下所示。

        from django.urls import path    
        
        urlpatterns = [
            ...
            path('polls/<string>/$','polls.views.detail')
            ...
        ]
        

        来源:https://docs.djangoproject.com/en/2.0/ref/urls/#django.urls.path

        【讨论】:

        • 尖括号中有slugintusername,但没有string。我认为数据类型后面必须跟:keyword。所以你的例子可能是错误的。
        【解决方案7】:

        如果您的尖括号参数是路径,即包含“/”,则必须使用path:

        示例:
        path('section/&lt;path:some_path&gt;,app.views.some_view,name='some_name')

        来源:https://docs.djangoproject.com/en/4.0/topics/http/urls/#path-converters

        (已编辑)
        "str - 匹配任何非空字符串,不包括路径分隔符'/'。如果表达式中不包含转换器,则这是默认值。

        slug - 匹配任何由 ASCII 字母或数字以及连字符和下划线字符组成的 slug 字符串。例如,build-your-1st-django-site。

        path - 匹配任何非空字符串,包括路径分隔符“/”。这使您可以匹配完整的 URL 路径,而不是像 str 那样匹配 URL 路径的一部分。”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-07
          • 2018-12-30
          • 2012-11-28
          • 1970-01-01
          • 2020-10-17
          • 2012-06-27
          • 2018-09-26
          • 1970-01-01
          相关资源
          最近更新 更多