Django: точки в слаге не работают в DetailView - PullRequest
1 голос
/ 25 июня 2019

Я моделирую сборки генома, имена которых часто содержат точку (.) Я написал 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)
    ...

My 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')
]

Этот URL работает: 127.0.0.1:8000/strain/SomeAssembly-1, этот не работает: 127.0.0.1:8000/strain/SomeAssembly.2.

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Краткий ответ : это правильное поведение для слизняка, поскольку слаг не должен иметь точек.

A слаг просто не допускает точек вслизнякВ самом деле, если мы slugify(..) [Django-doc] например 'foo.bar', мы получим:

>>> from django.utils.text import slugify
>>> slugify('foo.bar')
'foobar'

Следовательно, это абсолютно верно для не принимать точки.Таким образом, это означает, что SlugField вашей модели, скорее всего, неправильно слагает заголовок (или что-то еще «слагалищенное»).

Вы можете принять str ings и path s с помощью *Преобразователи пути 1023 * и path, как указано в документации для преобразователей пути [Django-doc] :

  • str - Соответствует любой непустой строке , за исключением разделителя пути, '/'.Это значение по умолчанию, если преобразователь не включен в выражение.

(..)

  • path - соответствует любой непустой строке , включая разделитель пути, '/'.Это позволяет сопоставлять полный путь URL-адреса, а не только сегмент пути URL-адреса, как с str.

Таким образом, вы можете указать, например:

path('assembly/<b><str:slug></b>/', views.AssemblyDetailView.as_view(), name='assembly-detail')

но опять же, это не слизняк.

1 голос
/ 25 июня 2019

Проблема заключалась в том, что стандартное slug-regex не принимает точки. Решение состоит в том, чтобы указать один, используя re_path, как это:

re_path(r'^assembly/(?P<slug>[0-9a-zA-Z.\-_ ]+)/$', views.AssemblyDetailView.as_view(), name='assembly-detail')

Все остальное работает так же.

...