Вывод статьи не по id, а по title в адресной строке
Как сделать так чтобы при переходе на статью было /page/title, вместо /page/id.
И если есть возможность, добавить второй вариант, где используются два и более значения, например /page/title&name...
Также в идеале закодировать ссылку в base64
файл url.py
urlpatterns = [
path('page/<id>/', post, name='sub-detail'),
]
файл models.py
class Post(models.Model):
title = models.CharField(max_length=100)
name = models.CharField(max_length=25)
overview = models.TextField()
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={
'id': self.id
})
файл views.py
def post(request, id):
return render(request, 'post.html', {})
Ответы (1 шт):
Если ты хочешь конкретно генерировать url от названия статьи (поля title), то придётся изучить генерацию slugify. Если хочешь проще, то в моделях добавь поле:
slug = models.SlugField("Постоянная ссылка", max_length = 50, blank=True, unique=True)
Также было бы круто определить метод, возвращающий ссылку на статью. Код ниже это делает, добавь его в models.py в свой класс Post (не забудь подключить reverse в верхней части код (не в классе Post))
from django.shortcuts import reverse
def get_absolute_url(self):
if self.slug is None:
return reverse('имя ссылки на персональную страницу из файла urls.py', kwargs={'pk': self.pk})
return reverse('имя ссылки на персональную страницу из файла urls.py', kwargs={'slug': self.slug})
Идём дальше. Тебе нужно будет ловить эти ссылки в файле urls.py. Реализуй примерно так (обрати внимание, что пусть со слагом стоит выше пути с идентефикатором):
path('post/<str:slug>/', имя класса(или фукции) обработчика, name='post-detail_url')
path('post/<int:pk>/', имя класса(или фукции) обработчика, name='post-detail_url')
В шаблонах для генерации ссылок используй следущий код:
{{ post.get_absolute_url }}