mydict = {"key1":"value1", "key2":"value2"}
Regularne sposób do wyszukiwania wartość słownika w szablonie Django jest {{ mydict.key1 }}
, {{ mydict.key2 }}
. Co jeśli klucz jest zmienną pętli? to znaczy:
{% for item in list %} # where item has an attribute NAME
{{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}
mydict.item.NAME
zawodzi. Jak to naprawić?
Pobierz w pętli zarówno klucz, jak i wartość ze słownika:
Uważam to za łatwiejsze do odczytania i pozwala uniknąć specjalnego kodowania. I tak zwykle potrzebuję klucza i wartości w pętli.
źródło
Nie możesz domyślnie. Kropka jest separatorem / wyzwalaczem dla wyszukiwania atrybutów / wyszukiwania klucza / plasterka.
Ale możesz utworzyć filtr, który pozwala przekazać argument:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
źródło
return value.get(arg)
ponieważ nie rzucałby wyjątku KeyError, jeśli klucz nie jest obecny.Dla mnie
template_filters.py
zadanie polegało na utworzeniu pliku Pythona o nazwie w mojej aplikacji z poniższą zawartościąużycie jest podobne do tego, co powiedział culebrón:
źródło
register = Library()
? Co to robi ?django.template.base.Library
klasie. przezregister = Library()
instancję tej klasy i wykorzystaniefilter
funkcji Annotator wewnątrz niego dotrzeć naszą potrzebę.Miałem podobną sytuację. Użyłem jednak innego rozwiązania.
W moim modelu tworzę właściwość, która wyszukuje słownik. Następnie w szablonie korzystam z właściwości.
W moim modelu: -
W moim szablonie: -
źródło
Ponieważ nie mogę komentować, pozwólcie, że zrobię to w formie odpowiedzi:
aby oprzeć się na odpowiedzi culebróna lub odpowiedzi Yuji „Tomita” Tomity , słownik przekazany do funkcji ma postać ciągu, więc może użyć ast. literal_eval, aby najpierw przekonwertować ciąg na słownik, tak jak w tym przykładzie .
Po tej edycji kod powinien wyglądać następująco:
źródło
Środowisko: Django 2.2
Umieszczam ten kod w pliku o nazwie template_filters.py w folderze projektu o nazwie portfoliomgr
Bez względu na to, gdzie umieścisz kod filtra, upewnij się, że masz __init__.py w tym folderze
Dodaj ten plik do sekcji bibliotek w sekcji szablonów w pliku projectfolder / settings.py. Dla mnie jest to portfoliomgr / settings.py
W kodzie HTML załaduj bibliotekę
źródło
env: django 2.1.7
widok:
szablon:
źródło
{{ dict_obj.obj.obj_name }}
jest w tym przypadku równoważny kodowi Pythondict_obj["obj"]["obj_name"]
, jednak pytanie dotyczy odpowiednikadict_obj[obj][obj_name]
.