当我发布带有 ManyToManyField 的 Django CMS 页面时,它只会显示在编辑页面中

问题描述 投票:0回答:1

当我发布带有 ManyToManyField 的 Django CMS 页面时,它只会显示在编辑页面中。

这是我的模型代码:

class ProductCarrossel(CMSPlugin):
    title = models.CharField(
        verbose_name='Título do Carrossel',
        max_length=150,
        null=True,
        blank=True,
    )

    subtitle = HTMLField(
        verbose_name='Subtítulo do Carrossel',
        max_length=1000,
        help_text='Insira um subtítulo para o Carrossel',
        null=True,
        blank=True,
        default='',
    )

    categories = models.ManyToManyField(
        Category,
        related_name="products_to_carrossel_by_category",
        blank=True,
        verbose_name='Selecione as Categorias desejadas',
    )

    subcategories = models.ManyToManyField(
        Subcategory,
        related_name="products_to_carrossel_by_subcategory",
        blank=True,
        verbose_name='Selecione as Subategorias desejadas',
    )

    text_color = models.CharField(
        max_length=30,
        choices=ColorClassesToTexts.choices,
        default=ColorClassesToTexts.AZUL,
        verbose_name='Somente os textos da capa',
        help_text='Selecione a cor dos textos',
    )

    def __str__(self):
        return "{}{}".format(self.title, self.subtitle)

    class Meta:
        verbose_name = 'Carrossel de Produtos'
        verbose_name_plural = 'Carrossíes de Produtos'

这是我的CSM插件代码:

@plugin_pool.register_plugin
class ProductCarroselPlugin5(CMSPluginBase):
    module = 'Produto'
    name = '04 - Produtos - Carrossel de Produtos'
    model = ProductCarrossel
    render_template = "productapp/product_carrossel.html"
    allow_children = False

    def render(self, context, instance, placeholder):

        if instance.show_only == 'category':
            carrossel_products = Product.objects.filter(
                category__in=instance.categories.all(),
                productimage__isnull=False, # Apenas produtos que tenham imagem
                productprice__price__gt=0, # Apenas produtos com preço > 0
                disp='disponivel'
            ).order_by('?')[:12]

        elif instance.show_only == 'subcategory':
            carrossel_products = Product.objects.filter(
                subcategory__id__in=instance.subcategories.all(),
                productimage__isnull=False, # Apenas produtos que tenham imagem
                productprice__price__gt=0, # Apenas produtos com preço > 0
                disp='disponivel'
            ).order_by('?')[:12]

        for product in carrossel_products:
            #Pegando preço dos produtos
            product_price = ProductPrice.objects.filter(id_product=product).get()
            product.price = product_price.price

        context.update({
            'instance': instance,
            'products': carrossel_products,
        })
        return context

这是编辑页面的插件:

这是发布页面的插件:

如何解决这个问题?

我只是尝试清理缓存并检查我的代码。我尝试编辑页面,再次删除并添加插件,但也没有成功。我可能认为这是因为我使用了“lated_name”,但事实并非如此。

感谢您的帮助。你太棒了!

django django-cms manytomanyfield octobercms-plugins
1个回答
0
投票

我需要在模型中添加函数“copy_relations”。最终的模型代码如下:

class ProductCarrossel(CMSPlugin):
title = models.CharField(
    verbose_name='Título do Carrossel',
    max_length=150,
    null=True,
    blank=True,
)

subtitle = HTMLField(
    verbose_name='Subtítulo do Carrossel',
    max_length=1000,
    help_text='Insira um subtítulo para o Carrossel',
    null=True,
    blank=True,
    default='',
)

show_only = models.CharField(
    max_length=16,
    choices=ProductCarrosselTypes.choices,
    default=ProductCarrosselTypes.CATEGORY,
    verbose_name='Usar somente a opção',
    help_text='Selecione entre Categoria, Subcategoria, Atributo ou Opção de Atributo',
)

categories = models.ManyToManyField(
    Category,
    related_name="products_to_carrossel_by_category",
    blank=True,
    verbose_name='Selecione as Categorias desejadas',
)

subcategories = models.ManyToManyField(
    Subcategory,
    related_name="products_to_carrossel_by_subcategory",
    blank=True,
    verbose_name='Selecione as Subategorias desejadas',
)

attributes = models.ManyToManyField(
    Attribute,
    related_name="products_to_carrossel_by_attribute",
    blank=True,
    verbose_name='Selecione os Atributos desejadas',
)

attribute_options = models.ManyToManyField(
    AttributeOption,
    related_name="products_to_carrossel_by_attribute_option",
    blank=True,
    verbose_name='Selecione as Opções de Atributos desejadas',
)

products = models.ManyToManyField(
    Product,
    related_name="products_to_carrossel_by_product",
    blank=True,
)

text_color = models.CharField(
    max_length=30,
    choices=ColorClassesToTexts.choices,
    default=ColorClassesToTexts.AZUL,
    verbose_name='Somente os textos da capa',
    help_text='Selecione a cor dos textos',
)

def copy_relations(self, oldinstance):
    self.categories.set(oldinstance.categories.all())
    self.subcategories.set(oldinstance.subcategories.all())
    self.attributes.set(oldinstance.attributes.all())
    self.attribute_options.set(oldinstance.attribute_options.all())
    self.products.set(oldinstance.products.all())

def __str__(self):
    return "{}{}".format(self.title, self.subtitle)

class Meta:
    verbose_name = 'Carrossel de Produtos'
    verbose_name_plural = 'Carrossíes de Produtos'
© www.soinside.com 2019 - 2024. All rights reserved.