Récemment, je viens de commencer à faire Python pour l'analyse de données, etc., et quand j'utilisais Django pour faire WebView avec Python de toute façon, j'ai essayé de créer un filtre personnalisé et d'y faire référence afin de faire référence à l'objet dictionnaire du côté modèle. Quand je l'ai fait, il y avait une partie à laquelle j'étais accro, alors je vais l'écrire ici.
Une des fonctions qui peuvent être appelées dans le template Django http://django-docs-ja.readthedocs.org/en/latest/howto/custom-template-tags.html
Filtre personnalisé qui fait référence à un objet dictionnaire templatetags/helper.py
from django import template
register = template.Library()
def get_dict_val(var,args):
dict_val = var
keys = [arg.strip() for arg in args.split(',')]
for key in keys:
dict_val = dict_val[key]
return dict_val
register.filter('dict_val',get_dict_val)
{{ dict_obj|get_dict_val:'key1,key2' }}
Vous pouvez faire référence à l'objet dictionnaire de cette manière. Vous pouvez faire référence à des objets à plusieurs niveaux en les séparant par des virgules.
{"1":{"0001":"Département des ventes"}}
Cependant, avec cette méthode, l'argument du côté du modèle ne peut être traité que sous la forme d'une chaîne de caractères, de sorte que les variables ne peuvent pas être transmises au filtre personnalisé. (Traitement des objets dans des boucles for, etc.)
#Erreur
{% for row in data %}
<p>{{ dict_obj|get_dict_val:row.no,row.busho_code }}</p>
{% endfor %}
Une fois, les deux variables ont été séparées par une virgule pour créer une chaîne, puis passées à l'argument.
def join_comma(var,args):
return "%s,%s" % (var,args)
register.filter('join_comma',join_comma)
{% for row in data %}
{% with row.no|join_comma:row.busho_code as shain_id %}
<p>{{ dict_obj|get_dict_val:shain_id }}</p>
{% endwith %}
{% endfor %}
Il semble y avoir un débat sur les arguments de filtre personnalisés. https://code.djangoproject.com/ticket/1199
Je pense qu'il est nécessaire de le concevoir de manière à ce que cela puisse être fait du côté de la vue autant que possible, mais il peut y avoir des situations où le côté du modèle doit accéder directement à l'objet dictionnaire en raison des spécifications, j'ai donc laissé la méthode ci-dessus.
Recommended Posts