2010-01-18 4 views
1

Je ne suis pas sûr que les décorateurs soient la meilleure façon de le faire, mais j'ai supprimé l'idée d'utiliser des processeurs de contexte et je ne suis pas sûr si un middleware est ce que je voudrais.Django + décorateurs: Ajout de contexte au modèle basé sur un critère

Ma situation est la suivante: Nous traitons les ventes et autres données quotidiennement. Chaque mois, nous fermons le mois comme toute autre entreprise. Nous le faisons sur papier, mais j'aimerais appliquer la même chose à notre système. Donc, fondamentalement, rendre les données en lecture seule si elle tombe dans la date de fermeture.

J'ai facilement compris comment faire cela du côté du traitement/du backend, mais comment passer un tel contexte à un template sans modifier une tonne de mes fonctions de vue? Je veux simplement passer un décorateur à mes fonctions qui vont tester la date de l'instance qui est passée et ajouter un peu de contexte au modèle afin que je puisse afficher un petit message, indiquant à l'utilisateur pourquoi le bouton "Enregistrer" est masqué.

J'espère que ma question est logique. Merci d'avance.

Répondre

4

J'utiliserais une balise de gabarit personnalisée. Il est très facile de définir des variables de contexte

#yourapp/templatetags/business_tags.py 

from django import template 
register = template.Library() 

class BusinessNode(template.Node): 
    def __init__(self, instance, varName): 
    self.instance, self.varName=instance, varName 

    def render(self, context): 
    instance=template.Variable(self.instance).render(context) 
    if instance.passes_some_test(): 
     context[self.varName]='Some message' 
    else: 
     context[self.varName]="Some other message" 
    return '' 
@register.tag 
def business_check(parser, token): 
    bits=token.split_contents() 
    if len(bits)==5: 
    return BusinessNode(bits[2],bits[4]) 
    return '' 

Ensuite, dans votre modèle

{% load business_tags %} 

{% business_check for someVar as myMessage %} 
{{myMessage}} 

Cela fonctionne aussi bien pour insérer d'autres types de données dans le contexte.

+0

Je ne peux pas croire que je n'ai pas pensé à une étiquette de modèle personnalisé. Soupir :) Merci pour votre aide et l'exemple! – Bartek

Questions connexes