Замените пробел с дефисами в Django URL - PullRequest
0 голосов
/ 14 апреля 2020

Я видел, что на многих веб-сайтах (включая stackoverflow) заголовок вопросов / статей в URL будет иметь дефисы, и я пытаюсь добиться того же для небольшого блогового приложения, использующего Django, однако до сих пор У меня 0 успехов.

Мой models.py выглядит следующим образом:

class Post(models.Model):
    title = models.CharField(max_length=255, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()

    def __str__(self):
        return self.title + '|' + str(self.author)

Определение URL как:

urlpatterns = [
    # re_path(r'^post/(?P<title>[\w\-]+)/$', PostView.as_view(), name='post_details'),
    path('post/<slug:title>', PostView.as_view(), name='post_details'),
]

и добавление следующего к views.py:

class PostView(DetailView):
    model = Post
    slug_field = slugify('title')
    slug_url_kwarg = slugify('title')
    template_name = 'post_details.html'

не увенчался успехом, поскольку заголовки с дефисами дают Страница не найдена (404) . Как видно из urls.py, я пытался использовать как регулярное выражение, так и более новый синтаксис Django 2.0+, и оба приводили к одному и тому же результату.

Моя ошибка в определении URL или я не представляю слизняк правильно для вида?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

вы можете попробовать это на вашем models.py. Это также рекомендуется при реализации URL-адресов страниц по умолчанию.

from django.template.defaultfilters import slugify

class Post(models.Model):
    title = models.CharField(max_length=255, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    slug = models.SlugField(unique=True)

def get_absolute_url(self):
        kwargs = {
            'pk': self.id,
            'slug': self.slug
        }
        return reverse('post-pk-slug-title', kwargs=kwargs)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

На вашем urls.py

path('post/<int:pk>-<str:slug>/', PostView.as_view(), name='post_details'),
0 голосов
/ 14 апреля 2020

У меня была та же проблема, что я сделал, добавив porperty в модели для слаг.

@property
def slug(self):
    return self.title.replace(" ", "-")[:50]` 

и в моем urls.py:

path (r'^(?P<slug>[a-z0-9-_]+?)', PostView.as_view(), name='post_details'),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...