将方法添加到Django CMS页面模型

ehxuflar  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(122)

问题/差距

Django CMS文档清楚地描述了extending the Page and Title Models的过程。然而,缺少关于添加方法(如下面的属性方法)的可能性的文档,或者我似乎找不到它。
注意:当我将它直接包含在Django CMS Page模型下时,所提供的示例可以完美地工作。这当然不是首选的方式。

问题

假设我想将下面的方法添加到页面(cms.models.pagemodel.Page)或标题模型(假设它们可能遵循相同的过程)* CMS应用程序 * 之外。如何做到这一点?

@property
    def my_custom_page_property(self):
        try:
            logger.info(f'Working....')
            return {}

        except Exception as e:
            logger.error(f'Error: {e}')
            return {}

尝试

在一个单独的应用程序中,我添加了下面的代码,并进行了迁移。图像场配置正确且工作正常。但是,该方法似乎没有返回任何内容。

from cms.extensions import PageExtension
from cms.extensions.extension_pool import extension_pool

class MyCustomExtension(PageExtension):
    image = models.ForeignKey(Image,
                              on_delete=models.SET_DEFAULT,
                              default=None,
                              blank=True,
                              null=True)

    @property
    def my_custom_page_property(self):
        ..
zbsbpyhn

zbsbpyhn1#

这是可能的-我已经设置了一个页面扩展,我用来添加图像到页面。
举个例子,

class PageImage(PageExtension):
    """Add images to pages"""

    image = models.FileField(
        verbose_name=_("Image"),
        upload_to=upload_to("page_images"),
        validators=[validate_data_size, validate_file_name],
        blank=True,
        null=True,
    )

    gallery = models.ForeignKey(
        to="filer.Folder",
        verbose_name=_("Image gallery"),
        blank=True,
        null=True,
        related_name="page_gallery",
        on_delete=models.SET_NULL,
    )

    @property
    def test_prop(self):
        return "Hello world"

    class Meta:
        app_label = "cms_extras"
        verbose_name = _("CMS Page Image")
        verbose_name_plural = _("CMS Page Images")

extension_pool.register(PageImage)

然后在模板中,我得到了;

<div class="hero" style="background: url({% if request.current_page.pageimage.image %}{{ request.current_page.pageimage.image.url }}{% endif %}) center center no-repeat; background-size: cover;">
            <div class="hero__text-wrapper">
                <h1>{% if request.current_page.pageimage.image %}{{ request.current_page.pageimage.test_prop }}{% endif %}</h1>
            </div>
        </div>

test_prop正在呈现到页面。

相关问题