Mažas
Mažas

Reputation: 397

django get context from external app in main template

I have integrated djangocms blog in my project. In homepage sidebar i want to display latest blog posts. Problem is, my homepage is django-cms page and i can't get blog post objects. urls.py:

urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    .....
    url(r'djangocms_blog/', include('djangocms_blog.urls', namespace='djangocms_blog')),
    url(r'^', include('cms.urls')),

)

Somehow here in main.html i should be able to get blog records:

    {% extends "base.html" %} 
<nav class="secondary-menu">
                <ul class="nav">
                    <!-- i need display them here -->
                </ul>
            </nav>

Is there any elegant way to do this?

Upvotes: 3

Views: 670

Answers (2)

Mažas
Mažas

Reputation: 397

Came up with other solution. Created new django-cms plugin:

class BlogLatestEntriesPluginNav(BlogLatestEntriesPlugin):
    name = _('Navigition latest blog entries')
    render_template = 'latest_entries_nav.html'

plugin_pool.register_plugin(BlogLatestEntriesPluginNav)

where BlogLatestEntriesPlugin is plugin from djangocms_blog app. And created new template 'latest_entries_nav.html'. Then in main.html

<ul class="nav">
    {% placeholder "left_sidebar" %}
</ul>

created placeholder and added that plugin.

Upvotes: 0

ohrstrom
ohrstrom

Reputation: 2970

Use either an assignment_tag or an inclusion_tag:

Templatetag

# templatetags/blog_tags.py
from django import template
from djangocms_blog.models import Post

register = template.Library()

@register.assignment_tag()
def latest_posts_as(limit=5):
    return Post.objects.order_by('-date_published')[0:limit]

@register.inclusion_tag('latest_posts.html', takes_context=True)
def latest_posts_inline(context, limit=5):
    qs = Post.objects.order_by('-date_published')[0:limit]
    context.update({'posts': qs})
    return context

Snippet for inclusion tag

<!-- latest_posts.html -->
{% for post in posts %}
    <p>{{ post }}</p>
{% endfor %}

Your home/whatever template

<!-- your_template.html -->
{% load  blog_tags %}
<div>

    <!-- using assignment_tag -->
    {% latest_posts_as limit=20 as posts %}
    {% for post in posts %}
        <p>{{ post }}</p>
    {% endfor %}

    <!-- using inclusion_tag -->
    {% latest_posts_inline limit=10 %}

</div>

The limit is optional - but could be handy :)

Upvotes: 2

Related Questions