遍历 Wagtail Snippets 内联对象

Posted

技术标签:

【中文标题】遍历 Wagtail Snippets 内联对象【英文标题】:Iterate through Wagtail Snippets Inline Objects 【发布时间】:2017-07-07 11:52:49 【问题描述】:

我有一个包含 2 个模型的餐厅菜单。 Product 模型和 MenuSelection 模型。一个产品可以属于多个菜单。 MenuSelection 作为内联关系添加到 Product

我面临的挑战是在ModelAdminlist_display 中列出菜单对象。我是否需要创建 ForeignKey 关系或创建循环访问 Inline 对象的 @property?在我的经验中,我肯定碰到了另一面墙。任何帮助将不胜感激。

菜单选择

class MenuSelection(ClusterableModel):
    menu_section = models.CharField(default=None, max_length=100, choices=MENU_CHOICES, unique=True, verbose_name='Menu Section')
    menu = models.CharField(default=None, max_length=100, choices=MENU, unique=True, verbose_name='Menu')
    menu_price = models.DecimalField(
        blank=True,
        null=True,
        max_digits=5,
        decimal_places=2,
        verbose_name='Menu Price',
        help_text='Numbers only with 2 digital decimal. I.e. 25.00'
    )

    panels = [

        MultiFieldPanel(
            [
                FieldPanel('menu'),
                FieldPanel('menu_section'),
                FieldPanel('menu_price'),
            ],
            heading="Menu & Prices",
            classname="collapsible"
        ),
    ]

产品

class ProductMenuPrices(Orderable, MenuSelection):
    page = ParentalKey('Product', related_name='menu_selection')


@register_snippet
class Product(ClusterableModel):
    product_title = models.CharField(max_length=255, verbose_name='Menu Item')
    product_description = models.TextField(verbose_name='Product Description', blank=True)

    panels = [
        MultiFieldPanel(
            [
                FieldPanel('product_title'),
                FieldPanel('product_description'),
                InlinePanel('menu_selection', label="Menu & Price Assignment", max_num=3),
            ],
            heading="Product Detail",
            classname="collapsible"
        ),
    ]

    class Meta:
        verbose_name = 'Menu Item'

    def __str__(self):
        return self.product_title

ProductModelAdmin

class ProductModelAdmin(ModelAdmin):
    model = Product
    menu_label = 'Menu'
    menu_icon = 'snippet'
    menu_order = 300
    add_to_settings_menu = False
    exclude_from_explorer = False
    list_display = ('product_title', 'product_description')
    list_filter = 'product_title',
    search_fields = 'product_title',


modeladmin_register(ProductModelAdmin)

【问题讨论】:

这是关于 django 管理员还是关于 wagtail 管理员中的 wagtail sn-ps? 抱歉,这些是用 Snippets 构建的。 【参考方案1】:

试试这样的:

   class Product(ClusterableModel):

       def get_menu_selection(self):
           menu_selection = self.menu_selection.count()
           return menu_selection

    class ProductModelAdmin(ModelAdmin):

        list_display = ('product_title', 'get_menu_selection')

干杯,

罗伯特

【讨论】:

【参考方案2】:

如果您希望这是 wagtail sn-ps 管理员中的一个关系,您需要使用他们的方法。

这是一个基于我的代码的未经测试示例,已被您的用例采用:

@register_snippet
class MenuSelection(ClusterableModel):
    # fields...

    def product_list(self):
        return ', '.join([menuproduct.product.name for menuproduct in self.products.all()])

    panels = [
        # field panels
        InlinePanel('products', label="Products", min_num=1)
    ]


@register_snippet
class Product(ClusterableModel):
    name = models.CharField(max_length=100)
    # fields ...

    @property
    def menu_selections(self):
        MenuSelection.objects.filter(products__in=[self])


class MenuSelectionProduct(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    menu_selection = ParentalKey(MenuSelection, related_name='products')

MenuSelectionProduct 定义了 ParentalKeyrelated_name。这样你告诉 django ORM 使这个关系在MenuSelection 上可用。 这使您可以在MenuSelection 上为此直通模型创建InlinePanelproduct_list 方法是关于如何在 MenuSelection 对象上进一步处理此关系的示例。而Product 上的属性menu_selection 可用于从另一个方向解析关系。

【讨论】:

我猜Product 一定不是ClusterableModel。它在我的代码中,因为我的模型和其他模型之间有相似的关系。但我现在不确定。

以上是关于遍历 Wagtail Snippets 内联对象的主要内容,如果未能解决你的问题,请参考以下文章

在wagtail-admin中有打开模态窗口的正确方法吗?

TypeScript 中的匿名/内联接口实现

Wagtail:序列化页面模型

获取动态图像 django / wagtail 的图像源

Wagtail:如何在管理员中设置计算字段(@property)标题

在 Ajax 成功上循环遍历对象内的数组内的对象