Django Tipps und Tricks III

25.05.2009 - 21:23 Uhr | Schlagworte: woche | strftime | filter

Heute mal ein halbwegs nerviger Workaround. Das Problem ist, dass wenn man mit wochenbasierten generischen Views arbeitet, eine Woche übergeben muss. Diese Woche meint man herauszufinden mit dem date Filter und zugehörigem Parameter W.

 

Pustekuchen! Der Filter arbeitet bei der Nummerierung von Wochen nach ISO-8601, was bedeutet, dass die Wochen von 1 bis 53 durchnummeriert werden und die Woche 1 die Woche im Jahr ist, die den ersten Donnerstag enthält. Der generische View nutzt aber strptime, was laut der Python-Dokumentation folgendes zurückliefert: Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.

 

Alles in allem ist der 1.1.2009 also einmal in Woche 1, ein anderes mal in Woche 0.

 

Hier mein Workaround, ein eigener kleiner Filter:

 

from django import template
import time

register = template.Library()

def strftime(value, arg=None):
    try:
        if arg != None:
            return time.strftime(value, arg)
        else:
            return time.strftime(value)
    except ValueError:
        return u""

register.filter('strftime', strftime)
Und weil es so gut dazu passt: Ich hatte schon mal Ärger mit den generischen Views, da ging es um die Übergabe des Monats. Gibt man nämlich kein Monats-Format mit an, so wird für den Monat sowas wie Apr übergeben (was man ja nicht zwingend merkt, wenn man nur den falschen Monat testet) und später dann wirds durch die Einstellung USE_I18N = True gleich mal mitübersetzt ins Deutsche. Ich hab es jedenfalls so gelöst, dass ich als Wert für das Monatsformat %m mit angebe und der reguläre Ausdruck dafür im Url-Pattern dann (?P<month>\d{2}) lautet.