在 url 中组合多个 slug

Posted

技术标签:

【中文标题】在 url 中组合多个 slug【英文标题】:Combining more than one slug in the url 【发布时间】:2019-08-07 22:25:52 【问题描述】:

我正在尝试使用两个 slug 来生成一种帖子的网址。我的网站按类别划分,每个人都有一个或多个帖子。

views.py

def singlePost(request, slug_post):
    blogpost = get_object_or_404(BlogPost, slug_post=slug_post)
    context = "blogpost": blogpost
    return render(request, "blog/single_post.html", context)


def singleCategory_postList(request, slug_category):
    category = get_object_or_404(Category, slug_category=slug_category)
    blogpost = BlogPost.objects.filter(category=category)
    context = 
            "category": category,
            "blogpost": blogpost,
            
    return render(request, "blog/single_category.html", context)

我使用的 urls.py

path("category/<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_post>/", views.singlePost, name='single_blog_post'),

我想使用的urls.py

path("<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_category>/<slug:slug_post>/", views.singlePost, name='single_blog_post'),

当我使用第二对路径时,它会显示给我:

NoReverseMatch 在 /blog/gis/

使用关键字参数 ''slug_post' 反转 'single_blog_post': 'rete-dei-sottoservizi-quadro-normativo'' 未找到。 1 个图案 试过: ['博客\/(?P[-a-zA-Z0-9_]+)\/(?P[-a-zA-Z0-9_]+)\/$']

models.py

class Category(models.Model):
    category_name = models.CharField(
                        max_length=50,
                        verbose_name="Categorie",
                        help_text="Every category must be not longer then 50 characters",
                        unique=True,
                        )
    slug_category = models.SlugField(
                verbose_name="Slug",
                unique=True,
                help_text="Slug is a field in autocomplete mode, but if you want you can modify its contents",
                )
....

    def __str__(self):
        return self.category_name

    def get_absolute_url(self): 
        return reverse("single_category", kwargs="slug_category": self.slug_category)


class BlogPost(ModelPost, TimeManager):
    category = models.ForeignKey(
                    Category,
                    on_delete=models.CASCADE,
                    related_name="category_set",
                    verbose_name="Categorie",
                    help_text="Select a category for this article.You can select only one category.",
                    )
    keyconcepts = models.ManyToManyField(
                    KeyConcept,
                    related_name="keyconcept_blog_set",
                    help_text="Select a key concept for this article. You can select one or more key concepts.",
                    verbose_name="Concetti chiave",
                    )
.....

    def get_absolute_url(self): 
        return reverse("single_blog_post", kwargs="slug_post": self.slug_post)

在this answer 中解释了如何做我尝试做的同样的事情,但对于我的情况,不能正常工作,我不明白为什么。

【问题讨论】:

【参考方案1】:

但是就像你说的,URL 包含两个 slug,所以你需要在反向调用中传递它们。并且您需要使用与 URL 模式本身相同的名称。

return reverse("single_blog_post", kwargs="slug": self.slug_post, "slug_category": self.category.slug_category)

【讨论】:

是的!显然我失去了一些东西! :( 我需要对我的 singlePost 进行一些更改,在下一篇文章中我会提供完整的解决方案 :)【参考方案2】:

感谢 Daniel Roseman 的指示,我通过进一步的改动解决了我的问题。

这是新的 singlePost 函数:

def singlePost(request, slug_post, slug_category):
    category = get_object_or_404(Category, slug_category=slug_category)
    blogpost = get_object_or_404(BlogPost, slug_post=slug_post)
    category_blogpost = BlogPost.objects.filter(category=category)
    context = "category": category, "blogpost": blogpost, "category_blogpost": category_blogpost
    return render(request, "blog/single_post.html", context)

下面是 Daniel Roseman 的代码:

return reverse("single_blog_post", kwargs="slug_post": self.slug_post, "slug_category": self.category.slug_category)

现在我可以在我的网站中使用两个 slug

【讨论】:

以上是关于在 url 中组合多个 slug的主要内容,如果未能解决你的问题,请参考以下文章

自定义帖子类型和分类法使用相同的 slug 和重写

.htaccess - 根据 URL slug 检查是不是存在多个文件并相应地重写?

强制 url 中的两个 slug 都存在于数据库中

url中的wordpress自定义帖子类型类别slug

多个 Slugs 冲突管理路由

.htaccess 中的多个连字符处理(URL 重写)