【问题标题】:Showing extended page attributes from reverse_id显示来自 reverse_id 的扩展页面属性
【发布时间】:2014-06-25 18:11:57
【问题描述】:

我制作了一个额外的图像字段,如@Timmy O'Mahony 所示 How to add some extra fields to the page in django-cms? (in django admin panel)

我想使用它的 reverse_id 从另一个页面调用这个图像字段,就像

{% page_attribute "extended_page_options.image" "my_page_reverse_id" %}

我需要自定义模板标签吗?我该怎么做?

我正在使用 django-cms 2.4.3 和 django 1.5.5

编辑:

models.py

from django.db import models
from django.utils.translation import ugettext_lazy as _
from cms.models.pagemodel import Page
from filer.fields.image import FilerImageField

class ExtendedPage(models.Model):   
    page = models.ForeignKey(Page, unique=True, verbose_name=_("Page"), editable=False, related_name='extended_fields')
    image = FilerImageField(blank=True, null=True)

【问题讨论】:

    标签: django django-cms django-filer


    【解决方案1】:

    在最近的一个项目中,我想我用 context_processor 解决了这个问题,如下所示:

    from django.conf import settings
    
    def page_extension(request):
    
        """Puts settings.DEBUG and the page_extension, if present and puts it into
        the context"""
    
        context = {'debug': settings.DEBUG}
    
        if request.current_page:
            page = request.current_page
    
            try:
                context.update({'page_extension': page.page_extension})
            except:
                try:
                    context.update({'page_extension': page.publisher_public.page_extension})
                except:
                    pass
    
        return context
    

    在这种情况下,我也借此机会添加了 settings.DEBUG 的值,这当然是可选的。

    然后,只需将其添加到您的设置文件中:

    TEMPLATE_CONTEXT_PROCESSORS = (
        ...
        'path.to.above.code.page_extension',
    )
    

    然后,下一步就是访问模板中的值:

    {% if page_extension and page_extension.my_page_property %}{{ page_extension.my_page_property }}{% endif %}
    

    【讨论】:

    • 我的猜测是该函数只检索当前页面的扩展字段。但是,您给了我一个想法,尝试通过 reverse_id 来获取页面检查它是否存在。由于我只需要几个模板,所以我会尝试制作一个自定义模板标签(似乎无法避免)
    • 好吧,TBH,您应该可以通过 {{ request.current_page.publisher_public.page_extension }} 或其他方式直接访问它。我的 template_context_processor 只是为了方便。
    • 是的,但问题是如何访问另一个页面的字段
    • 没关系。它实际上给了我有用的见解。
    【解决方案2】:

    首先,如果您要开始新项目,请选择django cms 3.0,与之前的版本相比,它具有许多令人兴奋的新功能。

    回到您的问题,转到包含实际图像字段的页面的高级设置并添加 id。然后在其他页面上这样做:

    {% page_attribute "field_name" "my_page_reverse_id" %}
    

    【讨论】:

    • 感谢您的提示。已经添加了 id(“索引”)。我尝试使用 {% page_attribute "image" "index" %} 检索名为“image”的额外图像字段,但没有成功。
    • 我也尝试过使用模型 related_name 无济于事(见编辑)。 {% page_attribute "extended_fields.image" "index" %} 也不起作用
    • 它引发了一个 Page.DoesNotExist:> 模板标签找不到带有查找参数 {'reverse_id': '', 'site': 1} 的页面。请求的 URL 是:example.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多