Как переопределить get_absolute_url в Django для разных полей?

Я хочу сделать метод get_absolute_url динамическим для различных представлений, основанных на классах.

Так, если в шаблоне, где выводится список всех статей в базе данных, я вызову функцию для атрибута {{ instance.get_absolute_url }}, эта ссылка приведет меня на blog/article/title.

Но затем я хочу иметь страницу, которая отображает всех авторов в базе данных, и когда я нажимаю на автора, следующая страница отображает все статьи этого автора, поэтому url будет blog/author/authorname.

Проблема в том, что я переопределил метод в классе Article следующим образом:

reverse(blog:article-detail, kwargs={'title': self.title})

Что мне нужно сделать, чтобы реализовать условие, которое проверяет, ищу ли я автора или название.

Я пробовал переопределить метод внутри класса AuthorArticleListView, который я создал для рендеринга шаблона, где будут отображаться статьи автора, но при вызове метода get_absolute_url в шаблоне, ссылка просто не работает и остается на той же странице, даже не выдает ошибку, но когда вызывается для статей, чтобы перейти в DetailView каждой статьи из ListView, она работает просто отлично.

Вот пути:

path('author/<str:author>/',AuthorArticleListView.as_view(),name='author-article-list') path('article/<str:title>/',ArticleDetailView.as_view(),name='article-detail')

Строки html, которые в основном одинаковы для обоих представлений:

<li class="list-group-item">
   <a href="{{ instance.get_absolute_url }}">{{ instance.title }}</a>
</li>

А get_absolute_url должен быть именно таким, абсолютным. Он не должен возвращать две разные формы. Он должен вести вас к окончательному детальному представлению этой модели.

Вы могли бы использовать get_absolute_url модели Author, если бы окончательным представлением этой модели был список их статей. Или вы можете просто использовать конструктор {% url 'author-article-list' author %} в вашем шаблоне.

Я не уверен, почему ваши ссылки в AuthorArticleListView не работают, особенно если {{ instance.title }} отображается правильно. Если это не так, попробуйте просто показать {{ instance }} для текста ссылки и посмотрите, что там есть, на что можно сослаться.

Вернуться на верх