2010-08-12 3 views
0

J'avais des difficultés à essayer d'itérer sur un gabarit sur deux dimensions en même temps.Spooky filtre de modèle personnalisé?

La situation de base est expliqué ici:

http://www.djangobook.com/en/2.0/chapter04/ (dans les pommes, les bananes indices exemple)

>>> from django.template import Template, Context 
>>> t = Template('Item 2 is {{ items.2 }}.') 
>>> c = Context({'items': ['apples', 'bananas', 'carrots']}) 
>>> t.render(c) 
u'Item 2 is carrots.' 

Si je voulais itérer de 1 à 3 sur ce point avec la variable "fruitstep", Je ne peux pas le faire dans un template:

{{items.fruitstep}} échoue et compte tenu des longues chaînes de points, ce concept conduirait à des exigences d'itérations massives sur le template. Mais je ne pouvais pas trouver une façon standard de le faire et je ne suis pas sûr que ce soit une bonne pratique de gabarit.

Donc, j'ai créé un filtre Modèle:

@register.filter 
def key2value(collection,key): 
    try: 
     return collection[unicode(key)] # It seems that my collection 
             # keys are in unicode... 
    except: 
     return "" 

Cela semble être un filtre extrêmement puissant. Il a commencé à être un tag très spécifique, mais je ne pouvais pas penser à une raison de ne pas le rendre complètement générique. Je me demande s'il existe une façon standard de le faire et j'ai réinventé la roue, ou si ce code pouvait faire quelque chose qui pourrait compromettre le système.

Merci!

+0

Je me rends compte que le problème de sécurité est lié à la sécurité de HTML. Je crois qu'en ne modifiant aucun défaut, il va échapper à l'info retournée, mais avec ce genre de filtre il serait impossible de vérifier que les éléments de la collection sont sûrs ... – iJames

Répondre

0

Non, il n'y a aucune raison de ne pas le faire dans votre propre application. J'ai souvent fait des filtres similaires, et j'ai en fait posté un code très similaire ici en réponse à diverses questions.

Il est difficile d'imaginer une façon dont la recherche de dictionnaire pourrait compromettre le système. Cette fonctionnalité n'est pas fournie par défaut dans Django en raison du désir initial d'avoir un langage de modèle restreint - on peut se demander si ce filtre particulier aurait dû être fourni depuis le début, mais étant donné qu'il ne l'était pas, il est peu probable à présent.

+0

Merci! Je suis content d'avoir l'assurance. En lisant la section sur les filtres personnalisés, il semble que le problème soit de rendre les chaînes HTML sûres. Il me semble que cela rendrait cela impossible, alors je peux voir comment cela pourrait être laissé à la discrétion du programmeur. Néanmoins, je pensais à un délimiteur alternatif pour séparer les groupes de points. Je peux voir ajouter au rendu de balise la possibilité d'ajouter plusieurs points pour diviser la chaîne de points peut-être? thispoll.thechoices..forloop.counter ou même thispoll.thechoices..myselectlist..forloop.counter Oh, déjà ambigu. Eh bien, retour au travail. – iJames

Questions connexes