Django:点头中的点在DetailView中不起作用

时间:2019-06-25 10:26:47

标签: django django-class-based-views slug detailview

我正在建模基因组程序集,其名称通常包含一个点(。)。 我编写了一个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

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]中指定的strpath路径转换器接受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')

其他所有东西都一样。