我正在进行一个生成动态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实际上是正确的,也许可以使用另一个字段。
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_/]+'