Некачественная загрузка шаблона в представлении общего списка 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'),
   
]
Вернуться на верх