Как переопределить 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 }} для текста ссылки и посмотрите, что там есть, на что можно сослаться.