【问题标题】:Django url that captures yyyy-mm-dd date捕获 yyyy-mm-dd 日期的 Django url
【发布时间】:2017-05-03 22:20:19
【问题描述】:

如何在 Django 中捕获包含 yyyy-mm-dd 的 url。所以就像 www.mydomain.com/2011-02-12。我试过了:

url(r'^(?P<date>\d{4}-\d{2}-\d{2})/$', views.index, name='index'), 

但是,服务器说找不到页面。

【问题讨论】:

    标签: python regex django django-urls


    【解决方案1】:

    在 Django 3.0.5 中,我使用以下 urls.py 完成此操作

    from django.urls import path, register_converter
    from datetime import datetime
    from . import views
    
    class DateConverter:
        regex = '\d{4}-\d{2}-\d{2}'
    
        def to_python(self, value):
            return datetime.strptime(value, '%Y-%m-%d')
    
        def to_url(self, value):
            return value
    
    register_converter(DateConverter, 'yyyy')
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('date/<yyyy:date>/', views.date, name='date'),
    ]
    

    【讨论】:

    • 很好,与公认的答案相比,这适用于 Django 3.1
    【解决方案2】:

    试试这个:

    url(r'^(?P<date>[0-9]{4}-?[0-9]{2}-?[0-9]{2})/$', views.index, name='index'),
    

    【讨论】:

      【解决方案3】:

      你应该在 url 模式中有一个组名:

      url(r'^(?P<date>\d{4}-\d{2}-\d{2})/$', views.index, name='index'),
      #          ^^^^
      

      还要注意 url 中的尾部斜杠:www.mydomain.com/2011-02-12/。如果您不想在 url 中使用斜杠,可以将其从模式中删除。


      然后您的视图函数会将组的名称作为其参数之一

      def index(request, date):
          ...
      

      你应该看到docs on Django url named groups

      【讨论】:

      • 虽然这一切都是正确的,但都不会导致问题中报告的“未找到”错误。
      • @DanielRoseman 尾部斜杠会。问题中的模式包括尾部斜杠,而 URL 不包括。
      • 我的正则表达式是否真的捕获了 yyyy-mm-dd?
      猜你喜欢
      • 2017-09-30
      • 2011-06-20
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多