Некачественная загрузка шаблона в представлении общего списка Django при использовании фильтра
У меня странное поведение моих общих представлений. Ниже приведена классическая схема FBV, которую я хочу воспроизвести в CBV
Мой FBV
def post_list(request, tag_name=None):
if tag_name:
# filter post according to tag name if provided
posts = Post.objects.filter(tag__tag_name=tag_name)
else:
posts = Post.objects.all()
context = {"posts": posts}
return render(request, "blog/post_list.html", context)
def post_detail(request, post_id):
post = Post.objects.get(pk=post_id)
context = {"post": post}
return render(request, "blog/post_detail.html", context)
Мое CBV
class PostList(ListView):
model = Post
context_object_name = "post_list"
template_name = "blog/post_list.html"
def get_queryset(self):
if "tag_name" in self.kwargs:
return Post.objects.filter(tag__tag_name=self.kwargs["tag_name"])
else:
return Post.objects.all()
class PostDetail(DetailView):
model = Post
context_object_name = "post_detail"
template_name = "blog/post_detail.html"
Вот мои модели
from django.db import models
# Create your models here.
class Tag(models.Model):
tag_name = models.CharField(max_length=100)
def __str__(self):
return self.tag_name
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
tag = models.ManyToManyField(Tag, blank=True)
def __str__(self):
return self.title
А вот мои урлы
from django.urls import path
from .views import PostList, PostDetail
urlpatterns = [
path("", PostList.as_view(), name="blog-index"),
path("<tag_name>", PostList.as_view(), name="blog-index"),
path("<int:pk>", PostDetail.as_view(), name="post-detail")
]
Как вы видите, я хочу использовать тот же самый общий вид для списка моих постов с необязательным тегом, указанным в url. Он хорошо фильтрует мои статьи, когда я предоставляю url с тегом, что-то вроде этого .../blog/my_tag
, но проблема в том, что процесс DetailView
больше не работает. Он загружает мой blog/post_list.html
с пустым списком всегда вместо моего шаблона blog/detail_post.html
. Процесс DetailView
работает нормально, когда я удаляю процесс фильтрации с помощью тега.
Надеюсь, это достаточно понятно. Что я делаю неправильно?
Проблемой здесь является шаблон url: Все ваши запросы детального просмотра сопоставляются со вторым путем, т.е.: path("<tag_name>", PostList.as_view(), name="blog-index"), попробуйте предоставить шаблон пути с конвертерами, чтобы они соответствовали тому, что вы хотите в вашем приложении.Последовательность здесь имеет значение, так как первое совпадение обслуживается первым.
Вместо этого:
urlpatterns = [
path("", PostList.as_view(), name="blog-index"),
path("<tag_name>", PostList.as_view(), name="blog-index"),
path("<int:pk>", PostDetail.as_view(), name="post-detail")
]
Вы можете различать некоторые префиксы и преобразователи путей так, чтобы они соответствовали точному регистру, как вы хотите, например:
urlpatterns = [
path('postlist/', PostList.as_view(),name='blog-index'),
path('postlist/<str:tag_name>/', PostList.as_view(),name='blog-index-tag'),
path('postdetail/<int:pk>/', PostDetail.as_view(),name='post-detail'),
]