À propos des arguments de filtre personnalisés de Django

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.

Filtre personnalisé

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 %}

Conclusion

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

À propos des arguments de filtre personnalisés de Django
Résumé du filtre Django
À propos des arguments de fonction (python)
Python: à propos des arguments de fonction
A propos de la gestion des fichiers statiques Django
Plongez dans la commande Django Custom [1]
Créer un filtre avec un modèle django
[Django] À propos des relations un-à-plusieurs (related_name, _set.all ())
L'histoire d'avoir un regard doux et douloureux sur les utilisateurs personnalisés sur Django