8

Django==1.5.1 Django-cms==2.4.1

django-cms で選択したページのすべての子ページから要約ビューのようなものを作成し、タイトル、切り捨てられたコンテンツなどを、リストされた子ごとに詳細... リンクを付けて作成したいと思います。タイトルとパスをうまく取得できましたが、プレースホルダーからコンテンツを取得するのに苦労しています。

次のようなテンプレートタグがあります。

from cms.models import Page
from cms.utils.page_resolver import get_page_from_path

from django import template


register = template.Library()


@register.inclusion_tag('news_summary_item.html')
def get_news_items():
    news_root = get_page_from_path('news')
    newsitems = news_root.children.filter(published=True)
    return {'newsitems':newsitems}

そして、これが使用するテンプレートです:

{% load cms_tags menu_tags %}
<ul>
{% for item in newsitems %}
    <li><a href="/{{ item.get_path }}">{{ item.get_title }}</a>
        {% for placeholder in item.placeholders.all %}
            # {% show_placeholder placeholder.slot item current_language %} #
        {% endfor %}
    </li>
{% endfor %}
</ul>

ここでプレースホルダーのコンテンツを取得するのを手伝ってくれる人はいますか? 理想的には、要約を取得するために truncatewords_html を介して渡すことができるようにしたいと考えていますが、同じ効果を得るために他の方法を使用することもできます。

ヒント/ポインタをありがとう!

4

1 に答える 1

3

1 つのプロジェクトで CMS コンテンツをインデックス化する必要があり、各プレースホルダーのコンテンツを取得し、プレースホルダーのコンテンツはそれに接続されたプラグインに保存されます

ビューで CMSPlugin のコンテンツを取得するにはどうすればよいですか?

from cms.models import CMSPlugin

plugin = CMSPlugin.objects.filter(plugin_type='TextPlugin')[0]  # Get first text plugin
# This return the body/content of the plugin:
plugin_content = plugin.get_plugin_instance()[0].body 

他のプラグインを管理したい場合は、次のようなPicturePlugin「alt」テキストを取得できます。

plugin_picture_content = plugin.get_plugin_instance()[0].alt

テンプレートでCMSPluginのコンテンツを取得するには?

# plugin_object containing a CMSPlugin
{{plugin_object.get_plugin_instance.0.body}}

コンテンツを取得したい場合は、 について話しているTextPluginと思いますが、ここでは注意が必要です。なぜなら、プラグイン タイプだけがTextPlugin属性bodyPicturePlugin持ち、 が属性altを持ち、 が属性をLinkPlugin持っているhrefなど...

問題に合わせたソリューション

placeholdersに対してループを実行しているため、プレースホルダーごとにすべてのプラグインを取得し、各プラグインのコンテンツを取得する必要があります。これは、前述のプレースホルダーのコンテンツがそれに接続されているプラ​​グイン (TextPlugin、PicturePlugin、リンクプラグイン...)。

...    ...    ...
{% for placeholder in item.placeholders.all %}  # Loop over placeholders
    {% for plugin in placeholder.get_plugin_list %}  # Get plugins for each placeholder
        {{plugin.get_plugin_instance.0.body|striptags}}
    {% endfor %}
{% endfor %}
...    ...    ...

TextPluginまた、他のプラグインのコンテンツのみを表示し、他のプラグインのコンテンツを表示しないようにするには、次のようにします。

...    ...    ...
{% for placeholder in item.placeholders.all %}  # Loop over placeholders
    {% for plugin in placeholder.get_plugin_list %}  # Get plugins for each placeholder
        {% if 'TextPlugin' in plugin.plugin_type %}
            {{plugin.get_plugin_instance.0.body|striptags}}
        {% endif %}
    {% endfor %}
{% endfor %}
...    ...    ...
于 2014-09-01T09:47:55.370 に答える