【问题标题】:How to make Tags and Categories Separate in django wagtail如何在 django wagtail 中使标签和类别分开
【发布时间】:2021-09-15 13:14:29
【问题描述】:

如何使标签和类别分开...我有一个用于 SCRC 的标签和一个用于库的标签,但是当我创建博客并选择每个不同的标签时,如何才能做到这一点? 这是我的models.py 文件。谢谢你的任何建议。 这是我的第一个 django wagtail 应用程序,我正在尝试创建一个测试博客。

from django.db import models
from django.utils.translation import deactivate_all
from modelcluster.fields import ParentalKey
from modelcluster.tags import ClusterTaggableManager
from taggit.models import Tag as TaggitTag
from taggit.models import TaggedItemBase
from wagtail.admin.edit_handlers import (
    FieldPanel,
    FieldRowPanel,
    InlinePanel,
    MultiFieldPanel,
    PageChooserPanel,
    StreamFieldPanel,
)
from wagtail.core.models import Page
from wagtail.images.edit_handlers import ImageChooserPanel
from wagtail.snippets.edit_handlers import SnippetChooserPanel
from wagtail.snippets.models import register_snippet

class BlogsPage(Page):
    description = models.CharField(max_length=255, blank=True,)

    content_panels = Page.content_panels + [FieldPanel("description", classname="full")]


@register_snippet
class BlogsCategory(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, max_length=80)

    panels = [
        FieldPanel("name"),
        FieldPanel("slug"),
    ]

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Category"
        verbose_name_plural = "Categories"
    #How am i going to filter this categories ()

@register_snippet
class Tag(TaggitTag):
    class Meta:
        proxy = True

class PostPageBlogsCategory(models.Model):
    page = ParentalKey(
        "blogs.PostPage", on_delete=models.CASCADE, related_name="categories"
    )
    blogs_category = models.ForeignKey(
        "blogs.BlogsCategory", on_delete=models.CASCADE, related_name="post_pages"
    )

    panels = [
        SnippetChooserPanel("blogs_category"),
    ]

    class Meta:
        unique_together = ("page", "blogs_category")


class PostPageTag(TaggedItemBase):
    content_object = ParentalKey("PostPage", related_name="post_tags")       

class PostPage(Page):
    header_image = models.ForeignKey(
        "wagtailimages.Image",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+",
    )

    tags = ClusterTaggableManager(through="blogs.PostPageTag", blank=True)

    content_panels = Page.content_panels + [
        ImageChooserPanel("header_image"),
        InlinePanel("categories", label="category"),
        FieldPanel("tags"),
    ]

【问题讨论】:

  • 您是否考虑过使用 sn-ps 代替?我用它们来标记我建立的网站上的不同类别。如果您想向 sn-p 添加更多细节,它工作得非常好并且具有更大的灵活性。 docs.wagtail.io/en/stable/topics/snippets.html#id1
  • 我如何在这里使用 sn-p,我有我的 models.py 和模板页面。
  • 对于您的答案,如何在前端查看特定类别中的帖子,例如 I SCRC 和库,当我选择 SCRC 时,我会看到 SCRC 和库的所有帖子,所以有我认为是我在models.py中需要的if语句。我在最初的问题帖子 imade 中添加了我的模型文件的外观。

标签: django blogs wagtail


【解决方案1】:

片段与任何模型一样,只是它被放入 Wagtail CMS 的不同区域。

以下是代码中 sn-p 的基本示例

@register_snippet
class Category(index.Indexed, models.Model):
    name = models.CharField(
        max_length=100,
        null=True,
    )

    panels = [
        FieldPanel('name'),
    ]

    search_fields = [
        index.SearchField('name'),
    ]

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['name']

以下是在 Wagtail 页面模型上引用 sn-p 的方法

class BlogPost(Page):
    category = ParentalManyToManyField(
            'Category',
            blank=True,
        )

    content_panels = Page.content_panels + [
        MultiFieldPanel([
            FieldPanel(
                'category',
                widget=forms.CheckboxSelectMultiple,
            )
        ],
            heading='Category'
        ),
    ]

如果您不想这样做,您也可以删除 widget=forms.CheckboxSelectMultiple

通过创建一个 sn-p,您现在可以选择创建“类别”,然后可以在博客文章中选择它们。

完成此操作后,您所要做的就是在 HTML 模板上查询 BlogPage 模型中的类别,然后根据需要显示或分组。

当我想要标签无法提供的更多灵活性时,我会使用 sn-ps。


编辑 当我浏览 Wagtail 文档时,我发现了 exactly what I mentioned

【讨论】:

  • 谢谢,我找到了这个教程,但我有两个类别,我如何在我的模型文件中对其进行编码,以便它只显示具有这些类别的每个帖子。
  • 您可以做一个简单的获取请求并通过 url 传递特定类别,然后查询该 url 参数以仅获取具有该类别的博客文章。与标签相同。 URL 在后端看起来类似于127.0.0.1:8000/?category=tech,您将解析查询字符串并使用它来进行数据库查找。 Blog.objects.filter(blog_category__name=qs) 其中 qs 是解析后的查询字符串
  • 这是有道理的,从我在第一个问题中发布的代码来看,我需要更改什么才能使您的逻辑正常工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多