当我发布带有 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”,但事实并非如此。
感谢您的帮助。你太棒了!
我需要在模型中添加函数“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'