Создание ссылки на конкретную статью блога по первичному ключу в Django и slugify url
Я следую некоторым базовым учебникам, чтобы изучить основы создания веб-сайтов на Django. У меня есть работающий "новостной шаблон", но мне трудно (понять) создание ссылок на конкретную статью базы данных и использование slug в url. Мне удалось найти только примеры, где список всех постов показывается со ссылками, но это не то, что я ищу.
У меня это:
models.py
class Post(models.Model):
title = models.CharField(max_length=200)
slug=models.SlugField(max_length=250, null=True, blank=True)
category=models.CharField(max_length=40)
text=RichTextField(blank=True, null=True)
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug=slugify(self.title)
super().save(*args, **kwargs)
# def get_absolute_url(self):
# return reverse('post_detail', kwargs={'slug': self.slug})
def get_absolute_url(self):
return reverse('post_detail', kwargs={"id":self.id, "slug":self.slug})
views.py
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
urls.py
urlpatterns = [
path('',views.index,name='index'),
path('articles/<int:pk>/', views.post_detail, name='post_detail'),
# path('articles/<slug>/', views.post_detail, name='post_detail')
]
html:
<a href="{% url 'post_detail' pk=1 %}">'*article headline from post.title (somehow)*'</a>
Это работает, когда я жестко кодирую первичный ключ статьи, но, конечно, url отображается с pk и не работает, если я пытаюсь использовать slug (NoReverseMatch).
Что я могу сделать в строке html, чтобы иметь возможность указывать на конкретную статью, но чтобы slugfield был показан в url? (Я не против вводить пк вручную, если все остальное работает)
models.py
def get_absolute_url(self):
return reverse('post_detail', kwargs={'slug': self.slug})
views.py
def post_detail(request, slug):
post = get_object_or_404(Post, slug=slug)
return render(request, 'blog/post_detail.html', {'post': post})
urls.py
#...
urlpatterns = [
path('articles/<slug>/', views.post_detail, name='post_detail'),
]
HTML
<a href="{{ post.get_absolute_url }}"> ... </a>