2016-08-21 4 views
0

Auf meiner Website erscheinen Blog-Posts an mehreren Stellen auf der Website. Ich möchte eine Vorlage wie blog_posts.html erstellen, die die Liste der Blogposts (als Argument zu render) erstellt den Block mit diesen Posts, formatiert und verarbeitet.Einschließlich der gleichen Blöcke auf mehreren Seiten in Django

Es gibt mehrere getrennte Seiten, auf denen ich blog_posts anzeigen möchte. Daher kann ich nicht sagen, dass blog_posts irgendwelche von ihnen erweitern. Ich frage mich, ob es eine Möglichkeit gibt, welche Vorlage auf eine beliebige Seite zu bearbeiten? Wenn ja, wie gebe ich Variablen (die Instanzen der Klassen sein können) an die Vorlage blog_posts weiter?

Antwort

1

Sie können entweder blog_posts.html bespannen machen und es als eine Variable auf die andere Vorlage übergeben:

from django.template.loader import get_template 
blog_posts = get_template('/path/to/blog_posts.htm') 
somevar = blog_posts.render({'foo': 'foo', 'bar': 'baz'}) 

dann legen {{ somevar }} in der anderen Vorlage - oder einfach nur {% include '/path/to/blog_posts.html' %} in der anderen; Die enthaltene Vorlage hat Zugriff auf alle Variablen, die an die übergeordnete Vorlage übergeben werden.

0

möchten Sie möglicherweise die Verwendung von Vorlagen-Tags in Betracht ziehen. Etwas wie das Inclusion-Tag sollte Ihnen gut tun (siehe hier für Dokumentation https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/#inclusion-tags)

Sie könnten das takes_context-Argument verwenden, um die Daten zu übergeben. So dass jede Seite, die Sie die Aufnahme-Tag auf Sie verwenden möchten, bereits die Seite mit einem Kontextvariable von ‚Daten‘ in der Ansicht bevölkern könnten dann diese Funktion würde Pickup darauf wie diese

@register.inclusion_tag('/path/to/blog_posts.html', takes_context=True) 
def blog_posts(context): 
    return { 
     'blog_posts': context['data'], 
    } 

Dann Nutzung in Sie html Datei, die Sie Blogposts in

{% blog_posts %} 

Verwendung von jeder Ansicht ziehen möchten. stellen Sie sicher, Datensatz wo immer Sie wollen auch den Template-Tag verwenden

def example_view(request): 
    context = {'data': Blog.objects.all()} 
    return render(request, 'example.html', context) 

Eine weitere Option ist es explizit passieren in als Argument wie diese

@register.inclusion_tag('/path/to/blog_posts.html') 
    def blog_posts(context, data): 
     return { 
      'blog_posts': data, 
     } 

Dann Nutzung

{% blog_posts data %} 

und natürlich würde Ihre blog_posts.html-Datei, die in dem Einschluss-Tag verwendet wird, etwas wie das Überschleifen der Daten

tun
<div> 
    {% for post in blog_posts %} 
    <p>{{ post.name}} 
    {% endfor %} 
</div> 
Verwandte Themen