[PYTHON] Informationen zu benutzerdefinierten Django-Filterargumenten

Vor kurzem habe ich gerade angefangen, Python für die Datenanalyse usw. zu verwenden. Als ich Django für WebView mit Python verwendete, habe ich versucht, einen benutzerdefinierten Filter zu erstellen und darauf zu verweisen, um von der Vorlagenseite auf das Wörterbuchobjekt zu verweisen. Als ich das tat, gab es einen Teil, von dem ich süchtig war, also werde ich ihn hier aufschreiben.

Benutzerdefinierte Filter

Eine der Funktionen, die in der Django-Vorlage aufgerufen werden können http://django-docs-ja.readthedocs.org/en/latest/howto/custom-template-tags.html

Benutzerdefinierter Filter, der auf ein Wörterbuchobjekt verweist 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' }}

Auf diese Weise können Sie auf das Dictionary-Objekt verweisen. Sie können auf mehrstufige Objekte verweisen, indem Sie sie durch Kommas trennen.

{"1":{"0001":"Verkaufsabteilung"}}

Bei dieser Methode kann das Argument von der Vorlagenseite jedoch nur als Zeichenfolge verarbeitet werden, sodass Variablen nicht an den benutzerdefinierten Filter übergeben werden können. (Verarbeiten von Objekten in for-Schleifen usw.)

#Error
{% for row in data %}
  <p>{{ dict_obj|get_dict_val:row.no,row.busho_code }}</p>
{% endfor %}

Fazit

Einmal wurden die beiden Variablen durch ein Komma getrennt, um eine Zeichenfolge zu erstellen, und dann an das Argument übergeben.

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

Es scheint eine Debatte über benutzerdefinierte Filterargumente zu geben. https://code.djangoproject.com/ticket/1199

Ich denke, dass es notwendig ist, es so zu gestalten, dass es so weit wie möglich auf der Ansichtsseite ausgeführt werden kann, aber es kann Situationen geben, in denen die Vorlagenseite aufgrund der Spezifikationen direkt auf das Wörterbuchobjekt zugreifen muss. Deshalb habe ich die obige Methode verlassen.

Recommended Posts

Informationen zu benutzerdefinierten Django-Filterargumenten
Django Filter Zusammenfassung
Über Funktionsargumente (Python)
Python: Über Funktionsargumente
Informationen zum Umgang mit statischen Django-Dateien
Tauche ein in den Django Custom Befehl [1]
Machen Sie einen Filter mit einer Django-Vorlage
[Django] Über eine Eins-zu-Viele-Beziehung (related_name, _set.all ())
Die Geschichte, einen süßen und schmerzhaften Blick auf benutzerdefinierte Benutzer auf Django zu werfen