我正在建模基因组程序集,其名称通常包含一个点(。)。 我编写了一个DetailView,它适用于不带点的名称,但不适用于带点的名称。我收到此错误:
404 - Using the URLconf defined in genomeDBmanager.urls, Django tried these URL patterns, in this order: ...
我的模特:
class Assembly(models.Model):
...
identifier = models.SlugField('unique identifier', max_length=50, unique=True)
...
我的view.py:
class AssemblyDetailView(DetailView):
slug_field = 'identifier'
template_name = 'overview/assembly.html'
model = Assembly
context_object_name = 'assembly'
我的概述/urls.py:
app_name = 'overview'
urlpatterns = [
...
path('assembly/<slug>/', views.AssemblyDetailView.as_view(), name='assembly-detail')
]
此网址有效:127.0.0.1:8000/strain/SomeAssembly-1
,而该网址无效:127.0.0.1:8000/strain/SomeAssembly.2
。
答案 0 :(得分:2)
简短答案:对于a来说,这是正确的行为,因为该supposed不应带点。
弹头根本不允许弹头中有点。确实,如果我们slugify(..)
[Django-doc]例如'foo.bar'
,我们将得到:
>>> from django.utils.text import slugify
>>> slugify('foo.bar')
'foobar'
因此不接受点绝对是有效的。因此,这意味着您模型的SlugField
可能无法正确显示标题(或任何“已隐藏”的内容)。
您可以使用documentation on path converters [Django-doc]中指定的str
和path
路径转换器接受str
ings和path
s:
str
-匹配任何非空字符串,但不包括路径分隔符'/'
。如果不包含转换器,则为默认设置 表达式。(..)
path
-匹配任何非空字符串,包括路径分隔符'/'
。这使您可以匹配完整的URL 路径,而不是像str
那样只是URL路径的一部分。
因此您可以指定例如:
path('assembly/<str:slug>/', views.AssemblyDetailView.as_view(), name='assembly-detail')
但是,这又不是。
答案 1 :(得分:1)
问题在于默认的slug-regex不接受点。解决方案是使用re_path这样指定一个:
re_path(r'^assembly/(?P<slug>[0-9a-zA-Z.\-_ ]+)/$', views.AssemblyDetailView.as_view(), name='assembly-detail')
其他所有东西都一样。