如何在 django url 中转义 '/'



我正在进行一个生成动态url的项目例如,如果您键入mysite.com/<您的文本在这里>网站应该用mysite.com/yourtexthere生成一个url(其中yourtexthere是一个模型的碎片(,我可以做到这一点,但当我放入类似mysite.com/yourtext here/moretext的东西时,问题就出现了,Django无法将其与我现有的任何url模式匹配,给了我404。

我想问的是,有没有一种方法可以将"/"视为另一个字符,并生成唯一的urlmymysite.com/yourtexthere/moretext,其中yourtexthere/moretext现在是slug。

视图.py

def textview(request, slug):
obj, created= Text.objects.get_or_create(slug=slug, defaults={'text':'', 'password':'123'})
return render(request, 'text/textpage.html', {'obj' : obj, 'created' : created})

urls.py

# Only patterns
urlpatterns = [
path('', home, name='home'),
path('<slug:slug>/', textview, name='textview'),
]

来自Django模型文档:

slug是事物的短标签,只包含字母、数字、下划线或连字符。

所以404实际上是正确的,也许可以使用另一个字段。

Django路径转换器使用regex匹配输入URL中的字符串。默认的路径转换器是非常基本的源代码。

slugConverter匹配任何只包含字符、数字和短划线而不包含正斜杠的字符串。在字符串yourtexthere/moretext中,它将匹配的最大子字符串是yourtexthere

pathConverter匹配包含任何类型字符的字符串,因此结果可以包含正斜杠。它将匹配所有yourtexthere/moretext。因此,将您的urlpatterns更改为:

# Only patterns
urlpatterns = [
path('', home, name='home'),
path('<path:slug>/', textview, name='textview'),
]

pathConverter将匹配所有特殊字符。如果你不想这样,你可以创建自己的自定义转换器,使用一个根据你的需求定制的正则表达式。例如,您可以简单地扩展slugConverter,使其也匹配具有正斜杠的字符串。

class SlugPathConverter(StringConverter):
regex = '[-a-zA-Z0-9_/]+'

最新更新