【问题标题】:Use show_placeholder inside inclusion tag template in Django CMS在 Django CMS 中使用包含标签模板内的 show_placeholder
【发布时间】:2019-04-09 07:16:08
【问题描述】:

我正在尝试使用 Django CMS 创建一个投资组合概览页面。

我已经有了我的详细信息页面,并且它们有一个名为 preview-img 的占位符。对于我的投资组合概览页面,我需要遍历所有详细信息页面并呈现该占位符。

Django docs 告诉我inclusion tag 是要走的路。所以我在templatetags 目录中定义了我的标签(show_portfolio),以便它返回页面:

from django import template
from cms.models.pagemodel import Page
from django.template import RequestContext

register = template.Library()

@register.inclusion_tag('portfolio_item.html', takes_context=True)
def show_portfolio(context, parent_slug):
    cms_pages = Page.objects.public()
    cms_pages = [
        page for page in cms_pages
        if page.parent_page and page.parent_page.get_slug() == parent_slug
    ]
    return {
        'cms_pages': cms_pages,
    }

它只是返回带有给定父页面的页面对象(通过 slug)。

我现在在其中循环 cms_pages 的模板是这样的(注意尝试呈现每个页面的 preview show_placeholder):

[portfolio_item.html]

{% load cms_tags %}

<div class="row">
    {% for page in cms_pages %}
        ...
        {% show_placeholder "preview-img" page %}
        ...
    {% endfor %}
</div>

运行此程序,服务器在尝试评估 show_placeholder 时遇到未捕获的 KeyError(键:request)。我没有看到与我正在做的事情的联系。请求在哪里发挥作用?甚至可以在inclusion tag 的模板中使用show_placeholder 吗?

这是完整性的跟踪:

追溯:

File ".../python3.6/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File ".../python3.6/site-packages/django/core/handlers/base.py" in _get_response
  217.                 response = self.process_exception_by_middleware(e, request)

File ".../python3.6/site-packages/django/core/handlers/base.py" in _get_response
  215.                 response = response.render()

File ".../python3.6/site-packages/django/template/response.py" in render
  107.             self.content = self.rendered_content

File ".../python3.6/site-packages/django/template/response.py" in rendered_content
  84.         content = template.render(context, self._request)

File ".../python3.6/site-packages/django/template/backends/django.py" in render
  66.             return self.template.render(context)

File ".../python3.6/site-packages/django/template/base.py" in render
  207.                     return self._render(context)

File ".../python3.6/site-packages/django/template/base.py" in _render
  199.         return self.nodelist.render(context)

File ".../python3.6/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File ".../python3.6/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File ".../python3.6/site-packages/classytags/core.py" in render
  153.         return self.render_tag(context, **kwargs)

File ".../python3.6/site-packages/sekizai/templatetags/sekizai_tags.py" in render_tag
  93.         rendered_contents = nodelist.render(context)

File ".../python3.6/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File ".../python3.6/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File ".../python3.6/site-packages/classytags/core.py" in render
  153.         return self.render_tag(context, **kwargs)

File ".../python3.6/site-packages/cms/templatetags/cms_tags.py" in render_tag
  443.             return toolbar.render_with_structure(context, nodelist)

File ".../python3.6/site-packages/cms/toolbar/toolbar.py" in render_with_structure
  498.         rendered_contents = nodelist.render(context)

File ".../python3.6/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File ".../python3.6/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File ".../python3.6/site-packages/django/template/library.py" in render
  245.         return t.render(new_context)

File ".../python3.6/site-packages/django/template/base.py" in render
  209.                 return self._render(context)

File ".../python3.6/site-packages/django/template/base.py" in _render
  199.         return self.nodelist.render(context)

File ".../python3.6/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File ".../python3.6/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File ".../python3.6/site-packages/django/template/defaulttags.py" in render
  216.                     nodelist.append(node.render_annotated(context))

File ".../python3.6/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File ".../python3.6/site-packages/django/template/library.py" in render
  203.         output = self.func(*resolved_args, **resolved_kwargs)

File ".../python3.6/site-packages/cms/templatetags/cms_tags.py" in _show_placeholder_by_id
  116.     request = context['request']

File ".../python3.6/site-packages/django/template/context.py" in __getitem__
  87.         raise KeyError(key)

【问题讨论】:

  • 当你对show_portfolio 中的上下文不做任何事情时,为什么你有takes_context=True?也许这就是把事情搞砸的原因......
  • @PoByBolek 是我在发布之前未能删除的实验的剩余物。但是,如果我删除它,行为不会改变。另外,干杯 8)

标签: django-cms


【解决方案1】:

通过在包含标签的上下文中显式传递请求,我在我的测试设置中得到了这个工作:

from django import template
from cms.models.pagemodel import Page

register = template.Library()

@register.inclusion_tag('portfolio_item.html', takes_context=True)
def show_portfolio(context, parent_slug):
    cms_pages = Page.objects.public()
    cms_pages = [
        page for page in cms_pages
        if page.parent_page and page.parent_page.get_slug() == parent_slug
    ]
    return {
        'request': context.request,
        'cms_pages': cms_pages,
    }

【讨论】:

  • 稍后会试试这个
  • 如果工作让您感到厌烦,并且您想在私人服务器以外的其他事情上花费更多时间,请随时查看我的最新问题:stackoverflow.com/questions/53392124/… /edit: 提及 ppl 似乎已被打破
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2013-04-02
  • 2016-08-12
  • 2013-06-05
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多