Django捕获yyyy-mm-dd日期的URL

14
在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'), 

但是服务器显示页面未找到。

3个回答

18

在 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'),
]

1
很好,与被接受的答案相比,这适用于Django 3.1。 - CGFoX
无法理解为什么这不是Django本身的一部分...甚至还有一个UUID转换器... - nerdoc

8

在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):
    ...

你应该查看Django url命名组的文档

1
虽然这些都是真的,但它们中的任何一个都不会导致问题中报告的“未找到”错误。 - Daniel Roseman
1
@DanielRoseman 在此情况下,尾随斜杠会影响匹配。问题中的模式包括尾随斜杠,而 URL 则没有。 - cdonat
我的正则表达式是否真的捕获了 yyyy-mm-dd? - PythonAnywhere

1

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接