如何添加类别片段,用于不同的片段

How to add a snippet of category, used in a different snippet

如何在另一个名为资源的代码段中使用类别代码段?我想要一个按类别过滤的资源列表,类别是它自己的一个片段。我在尝试创建资源时遇到此错误:

AttributeError at /admin/snippets/home/resource/add/
'ForwardManyToOneDescriptor' object has no attribute 'rel'

这是我的代码:

class Resource(models.Model):
    """Snippet for Resources"""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    resource_name = models.CharField(max_length=128, blank=False, null=True)
    phone_number = models.CharField(max_length=12, blank=True, null=True)
    website = models.URLField(blank=True, null=True)
    info = RichTextField(blank=True, null=True)
    category = models.ForeignKey('ResourceCategory', on_delete=models.CASCADE, null=True, blank=True)

    panels = [
        MultiFieldPanel(
            [
                FieldPanel("resource_name"),
                FieldPanel("phone_number"),
            ],
            heading="Resource information"
        ),
        MultiFieldPanel(
            [
                FieldPanel('website')
            ],
            heading="Links"
        ),
        MultiFieldPanel(
            [
                FieldPanel('info')
            ],
            heading="Info"
        ),
        MultiFieldPanel(
            [
                InlinePanel("category", label="Category")
            ]
        )
    ]

    def __str__(self):
        """String representation of this class"""
        return self.resource_name

    class Meta:
        verbose_name = "Resource"
        verbose_name_plural = "Resources"

register_snippet(Resource)

class ResourceCategory(models.Model):
    """Snippet for Resources"""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    category_name = models.CharField(max_length=128, blank=False, null=True)

    panels = [
        MultiFieldPanel(
            [
                FieldPanel('category_name')
            ],
            heading="Category"
        )
    ]

    def __str__(self):
        """String representation of this class"""
        return self.category_name

    class Meta:
        verbose_name = "Category"
        verbose_name_plural = "Categories"

register_snippet(ResourceCategory)

category 字段应使用 FieldPanel('category'),而不是 InlinePanel。 InlinePanel是为了管理属于snippet的多个子对象,但是这里一个Resource只属于一个ResourceCategory。

(如果您打算允许资源属于多个类别,则需要调整您的模型,以便 Resource 有一个子模型,其中包含一个 ParentalKey 到 Resource 和一个 ForeignKey 到 ResourceCategory。)