Ich habe die einzelnen PHP-Dateien in jeweils ein Template und eine View-Funktion auseinander gezogen. Da der PHP-Author recht großzügig mit lokalen Variablen umging, habe ich einfach folgendes benutzt:
Code: Alles auswählen
@render
def index(request, player=None):
...
return locals()
Die render-Funktion benutze ich auch in anderen Projekten gerne, um nicht jedes Mal "render_to_response" aufrufen zu müssen. Eine Variante, wo man den Namen des Templates wählen kann, ist fast genauso einfach.
Code: Alles auswählen
def render(func):
def inner(request, *args, **kwargs):
kwargs['player'] = setup(request)
result = func(request, args, kwargs)
if isinstance(result, dict):
result['player'] = kwargs['player']
return render_to_response(func.__name__ + '.html', RequestContext(request, result))
return result
return inner
def start(request):
if 'id' not in request.session: return None
return Player.objects.get(id=request.session['id'])
Code: Alles auswählen
@post(ViewForm)
def formview(request, form, player=None):
...
return redirect(index)
def post(form):
def inner(func):
def inner2(request, form):
player = start(request)
if request.method == 'POST':
f = form(request.POST)
if f.is_valid(): return func(request, form, player=player)
else: f = form()
return render_to_response(form.__name__ + '.html', RequestContext(request, {'form': f}))
return inner2
return inner
Am Mühsamsten war es übrigens, die HTML-Templates zu erstellen und vernünftig zu formatieren.
Dazu speziell noch ein Problem aus einem anderen Projekt (in Coldfusion): Wie setzt man sowas am besten mit Django um?
Code: Alles auswählen
<cfif p.id is playerID><cfset color="Aqua">
<cfelseif p.allianceID gt 0 and (p.allianceID is myAllianceID)><cfset color="Fuchsia">
<cfelseif p.allianceID gt 0 and (p.allianceID is ally1 or p.allianceID is ally2 or p.allianceID is ally3)><cfset color="PeachPuff">
<cfelseif p.allianceID gt 0 and (p.allianceID is war1 or p.allianceID is war2 or p.allianceID is war3)><cfset color="Crimson">
<cfelseif p.turn lte 72><cfset color="Yellow">
<cfelse><cfset color="White"></cfif>
Auch andere Kleinigkeiten lassen mich die Möglichkeit, einfache Ausdrücke in den Template schreiben zu können vermissen, hier ein Beispiel aus Rails:
Code: Alles auswählen
There are <%= posts.count - 1 %> replies.
Code: Alles auswählen
{{posts|length|add:-1}}
Stefan