Как сделать так, чтобы Django перенаправлял на другую страницу?
У меня есть приложение "произведения", в котором должны быть все мои произведения. Есть карточки-превьюшки к моим работам. Я хочу, чтобы они были кликабельны и перенаправляли на произведение, на которое кликнули, и вскоре показывали html-файл произведения. Проблема заключается в перенаправлении на эту работу.
В myapp/urls.py находится следующее
urlpatterns = [
path("", WorksView.as_view(), name="works"),
path("<slug:work_slug>/", WorkDetailView.as_view(), name="work-detail"),
]
myapp/models.py
class Works(models.Model):
-- other attributes --
slug = models.SlugField(
null=False,
db_index=True,
blank=False,
max_length=255,
unique=True,
verbose_name="URL",
)
def get_absolute_url(self):
from django.urls import reverse
return reverse("work-detail", kwargs={"work_slug": self.slug})
Так какой класс, основанный на представлении, следует использовать в myapp/views.py для WorkDetailView? Я пробовал View, TemplateView, RedirectView, но ни один из них не работает должным образом, как я хочу.
Последняя попытка была такой:
class WorkDetailView(View):
def get(self, request, *args, **kwargs):
work = get_object_or_404(
Works, slug=kwargs["work_slug"]
)
print(work.get_absolute_url())
return render(request, work.get_absolute_url(), {"works_data": work})
Work.get_absolute_url работает хорошо, но Django не может найти шаблон
Моя папка проекта:
Но когда я изменяю возвращаемую строку на return render(request, f"{work.get_absolute_url()[1:-1]}.html", {"work": work})
она работает и печатает "works/not-found/", но я не думаю, что это правильный путь
Так как же мне сделать это правильно?
Последняя попытка была сделать это с помощью View, но Django говорит TemplateDoesNotExist at /works/not-found/
Это фрагмент из моего work.html
{% block body %}
<div class="intro" id="#intro">
<div class="container">
<div class="works">
{% for work in works_data %}
<a href="{{ work.get_absolute_url }}" class="work__item">
{% if work.preview %}
<img src="{{ work.preview.url }}" class="work__preview"></img>
{% else %}
<div class="work__preview">Photo preview</div>
{% endif %}
<h1 class="work__title">{{ work.title }}</h1>
<div class="work__description">{{ work.description }}</div>
</a>
{% endfor %}
</div>
</div>
</img>
{% endblock %}