【问题标题】:Nested categories/InlinePanel(s) in wagtailwagtail 中的嵌套类别/InlinePanel
【发布时间】:2015-11-11 13:37:09
【问题描述】:

我很难实现诸如“嵌套类别”之类的东西:

PageA:
  - Cat1
    - SubCat1
    - SubCat2
    - ...
  - Cat2
    - SubCat1
  - ...

所有类别和子类别都应可由编辑器排序和编辑。

我的猜测是这样的:

class CategoryTestPage(Page):
    content_panels = Page.content_panels + [
        InlinePanel('categories')
    ]


class Category(Orderable,ClusterableModel,models.Model):
    page = ParentalKey(CategoryTestPage, related_name='category')
    category = models.CharField(max_length=250)

    def __str__(self):
        return "%d %s" % (self.id, self.category)

    panels = [
            FieldPanel('category'),
            InlinePanel('subcategory')
    ]

class SubCategory(Orderable,models.Model):
    category = ParentalKey(ProjektOrdnung, related_name='subcategory')
    subcategory = models.CharField(max_length=250)

    def __str__(self):
        return "%d %s" % (self.id, self.subcategory)

    panels = [
            FieldPanel('subcategory')
    ]

但这会导致'CategoryForm' object has no attribute 'formsets'。看来嵌套InlinePanels 有问题?

我还需要这种“分层分类法”来将其中一些类别/子类别分配给其他页面:

PageB:
    - has Cat1
      - has SubCa2
    - ...

...看起来很像分层标签...

任何想法如何实现这个或我的实现有什么问题?

亲切的问候, 墓碑

PS:我在 wagtail 1.2rc1

【问题讨论】:

    标签: wagtail


    【解决方案1】:

    这是一种方法,界面改进空间很大;)为了在页面级别对类别进行排序,我建议使用django-sortedm2m

    from wagtail.wagtailcore.models import Orderable, Page
    from wagtail.wagtailsnippets.models import register_snippet
    from django.db import models
    
    
    @register_snippet
    class Category(models.Model):
        name = models.CharField(
            max_length=80, unique=True, verbose_name=_('Category Name'))
        slug = models.SlugField(unique=True, max_length=80)
        parent = models.ForeignKey(
            'self', blank=True, null=True, related_name="children",
            help_text=_(
                'Categories, unlike tags, can have a hierarchy. You might have a '
                'Jazz category, and under that have children categories for Bebop'
                ' and Big Band. Totally optional.')
        )
        description = models.CharField(max_length=500, blank=True)
    
        class Meta:
            ordering = ['name']
            verbose_name = _("Category")
            verbose_name_plural = _("Categories")
    
        panels = [
            FieldPanel('name'),
            FieldPanel('parent'),
            FieldPanel('description'),
        ]
    
        def __str__(self):
            return self.name
    
        def clean(self):
            if self.parent:
                parent = self.parent
                if self.parent == self:
                    raise ValidationError('Parent category cannot be self.')
                if parent.parent and parent.parent == self:
                    raise ValidationError('Cannot have circular Parents.')
    
        def save(self, *args, **kwargs):
            if not self.slug:
                self.slug = slugify(self.name)
            return super(Category, self).save(*args, **kwargs)
    
    
    class CategoryPage(models.Model):
        category = ParentalKey('Category', related_name="+", verbose_name=_('Category'))
        page = ParentalKey('MyPage', related_name='+')
        panels = [
            FieldPanel('category'),
        ]
    
    
    class MyPage(Page):
        categories = models.ManyToManyField(Category, through=CategoryPage, blank=True)
        content_panels = Page.content_panels + [
            FieldPanel('categories'),
        ]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多