Ein paar Template-Helfer (Templatetags)

Im Zuge der Neuordnung meiner Seite habe ich die Codebasis von Grund auf überholt. Diese Seite war mein erstes Projekt mit Django und natürlich sammelt sich viel Müll an. Von ehemals über 30 Template-Tags und Filtern sind nur noch eine Hand voll über geblieben.

Django bringt von zu Hause schon eine mächtige Template-Engine mit, einige Kleinigkeiten fehlen noch. Nichts spektakuläres aber vielleicht ist der eine oder andere interessiert:

Einträge aus Models lesen

Den Anfang macht der Tag "get_all". Damit lassen sich die Einträge eines beliebigen Models auslesen und im Template anzeigen. Dieser Tag ist mein Standard-Tag und in fast jedem Template zu finden.

class ContentNode(Node):
    def __init__(self, model, num, varname, order_type):
        self.num, self.varname = num, varname
        self.modelname = model
        self.order_type = order_type
        self.model = get_model(*model.split('.'))

    def render(self, context):
        context[self.varname] = self.model._default_manager.order_by(self.order_type)[:self.num]
        return ''

@register.tag
def get_all(parser, token):
    '''
    {% get_all model.Model maxnum as varname order_by field %}
    '''
    bits = token.contents.split()
    if len(bits) != 7:
        raise TemplateSyntaxError, "get_all tag takes exactly six arguments"
    if bits[3] != 'as':
        raise TemplateSyntaxError, "third argument to get_latest must be 'as'"

    return ContentNode(bits[1], bits[2], bits[4], bits[6])

Der Satz Die neuesten 10 Einträge aus dem Weblog, geordnet nach dem Datum absteigend währe:

{% get_all weblog.Entry 10 as all_entries order_by -date_published %}

Genauso gut könnten es die 10 letzten Kommentare, Fotos oder Links sein. Wie gesagt, dieser Tag ist Standard bei mir und sehr, sehr nützlich.

Leerzeichen am Anfang und Ende entfernen

@register.filter
def trim(value):
    return value.rstrip('\r\n    \s').lstrip('\r\n    \s')

Eine URL auslesen und den Inhalt ausgeben

import urllib
@register.simple_tag
def include_url(url):
    return urllib.urlopen(url).read()

Strings beschneiden

@register.filter
def truncate(value, max=1):
    '''Schneidet einen String nach x Zeichen ab, Standard ist 1 (|truncate:10)'''
    return value[0:max]

Die favicon-Adresse aus einer beliebigen URL generieren

import urlparse
@register.filter
def favicon_url(value):
    return urlparse.urljoin(value,'/favicon.ico')

Monats-Liste

Zu guter letzt noch ein Tag, der für Weblog-Betreiber interessant ist. Dieser Tag gruppiert das Datumsfeld meiner Einträge und gibt eine Liste aller Monate zurück. Damit generiere ich die Monats-Archivliste auf freakydog.de.

from project.app.model import Entry

class ConentNode(Node):
    def __init__(self, varname):
        self.varname = varname

    def render(self, context):
        context[self.varname] = Entry.objects.dates("date_published", "month", "DESC")
        return ''

@register.tag
def get_months_for_entry(parser, token):
    bits = token.contents.split()
    return ConentNode(bits[2])

Der Aufruf mitsamt Ausgabe im Template wäre:

{% get_months_for_entry as entrydates %}
{% for d in entrydates %}
<li><a href="...">{{ d|date:"F Y"}}</a></li>
{% endfor %}

Übrigens gibt es noch die fantastische Seite djangosnippets.org auf der sich noch Hunderte weitere Codeschnipsel finden.


Comments closed

Sorry, new comments are no longer allowed for this entry.

Write me an email if you have feedback or any questions regarding this post. If you found this post useful and just want to say thank you then don't forget that I have an Amazon Wishlist. :-)


↑ to the elevators

© 2001—2010 Martin Mahner. This is an I ♥ Django Project.

Admin | Generated: Tue, 9 Mar 2010 21:14:41 +0100