使用基于类的视图向类别slug和Post slug发送Urls

时间:2018-11-16 09:59:34

标签: django redirect django-views django-urls django-2.1

我正在开发一个简单的博客来学习Django。我想为每个帖子都提供这样的路径:

  
      
  • / category-1 / title-post
  •   
  • / category-2 / title-post
  •   
  • 等。
  •   

urls.py

from django.urls import include, path
from .views import CategoryList, PostList, SingleCategory, SinglePost, SingleTag, TagList

urlpatterns = [
        path("", PostList.as_view(), name="list_post"),
        path("<slug:slug>", SinglePost.as_view(), name="single_post"),
        path("tags/", TagList.as_view(), name="list_tag"),
        path("tags/<slug:slug>", SingleTag.as_view(), name="single_tag"),
        path("categories/", CategoryList.as_view(), name="list_category"),
        path("categories/<slug:slug>", SingleCategory.as_view(), name="single_category"),
]

views.py

from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView

from .models import Category, Post, Tag
# Create your views here.

class CategoryList(ListView):
    model = Category
    context_object_name = 'category_list'
    template_name = "list_category.html"


class SingleCategory(DetailView):
    model = Category
    template_name = "single_category.html"


class PostList(ListView):
    model = Post
    queryset = Post.objects.order_by('-id')
    context_object_name = 'post_list'
    template_name = "list_post.html"
    paginate_by = 4


class SinglePost(DetailView):
    model = Post
    template_name = "single_post.html"


class TagList(ListView):
    model = Tag
    context_object_name = 'tag_list'
    template_name = "list_tag.html"


class SingleTag(DetailView):
    model = Tag
    template_name = "single_tag.html"

此处 models.py

class Category(models.Model):
    category_name = models.CharField(
                max_length=50,
                )
    slug = models.SlugField(
                unique=True,
                )

    def __str__(self):
        return self.category_name

    def get_absolute_url(self):
        return reverse("single_category", kwargs={"slug": self.slug})


class Post(models.Model):
    title = models.CharField(
                max_length=50,
                )
    slug = models.SlugField(
                unique=True,
                )
    content = models.TextField()
    tag = models.ManyToManyField(
                Tag,
                related_name="tag_set",
                )
    category = models.ForeignKey(
                    Category,
                    on_delete=models.CASCADE,
                    related_name="category_set",
                    )
    highlighted = models.BooleanField(
                    default=False,
                    )

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("single_post", kwargs={"slug": self.slug})

    class Meta:
        ordering = ['-id']

我不明白如何更改“ category-slug /” 中的路径“ categories /” 。我想对 categories / 做同样的事情,必须在 category-slug / post-slug 中进行更改。

如何使用基于类的视图做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以根据需要在URL中定义尽可能多的参数。然后,您需要覆盖get_object才能按类别和类别获取相关帖子。

path('<slug:category_slug>/<slug:post_slug>', SinglePostByCategory.as_view(), 'single_post_by_category')

...

class SinglePostByCategory(DetailView):
    def get_queryset(self):
        return get_object_or_404(Post,
            category__slug=self.kwargs['category_slug'],
            slug=self.kwargs['post_slug']
        )