首页 > 解决方案 > Django 3.0 中不区分大小写的 URL?

问题描述

有没有办法让 Django 2.0 及以上语法不区分大小写的 URL?

例如

path('profile/<str:username>/add/',views.AddFriendRedirect.as_view(),name='add_friend'),

如果我这样做了profile/USERNAME,当用户名是全小写的用户名时,我怎样才能使它不区分大小写?所以即使是 uSERnAmE 也是有效的

我知道旧语法有问题和答案url,但我想知道新path语法是否可能

标签: pythondjangopython-3.xdjango-urls

解决方案


有没有办法让 Django 2.0 及以上语法不区分大小写的 URL?

如果完整的 url 不区分大小写,除了链接的 SO post中的答案之外,我看不到任何其他方式。但我从 OP 收集到的是,只有用户名部分不区分大小写。如果我们按照正则表达式的解决方案(?i),这个 url 也将是有效PrOFile/UsERname/AdD的。

但看起来 OP 只希望用户名比较不区分大小写。使用str转换器,在 url 中传递的任何内容都将按原样传递给视图。所以在真正意义上,它已经不区分大小写了。这里建议的方法应该是在视图中username__iexact用于获取用户。

但是,如果我们希望传递给视图的用户名值与视图要求的格式相同,例如小写,我们可以为此注册一个自定义路径转换器。

因为 OP 最初使用的是字符串转换器,我们可以扩展它并覆盖to_python以将值转换为小写。我在这里使用小写字母,因为在 OP 中提到用户名是小写字母。

class IStringConverter(StringConverter):

    def to_python(self, value):
        return value.lower()

# once done, register it as:
register_converter(IStringConverter, 'istr')

# and use it as:
path('profile/<istr:username>/add/',views.AddFriendRedirect.as_view(),name='add_friend'),

推荐阅读