Chcę połączyć łańcuch w znaczniku szablonu Django, na przykład:
{% extend shop/shop_name/base.html %}
Oto shop_name
moja zmienna i chcę połączyć to z resztą ścieżki.
Załóżmy, że mam shop_name=example.com
i chcę, aby wynik przedłużył się shop/example.com/base.html
.
django
django-templates
Ahsan
źródło
źródło
shop_name
, więc jest niebezpieczne.shop_name
przed przekazaniem go do kontekstu w widoku,get_context_data
upewnij się, że jest tłumaczony przy użyciuugettext
zamiastugettext_lazy
.Nie używaj
add
ciągów znaków, powinieneś zdefiniować niestandardowy tag, taki jak ten:Utwórz plik:
<appname>\templatetags\<appname>_extras.py
a następnie użyj go, jak mówi @Steven
Powód unikania
add
:Według dokumentów
Gdyby obie zmienne były liczbami całkowitymi, wynik byłby nieoczekiwany.
źródło
add
” po prostu nie używastr()
na pierwszym miejscu i nie działała w ogóle dla mnie, podczas gdy twoje rozwiązanie działa bezbłędnie{% load <appname>_extras %}
Zmieniłem hierarchię folderów
a następnie poniżej będzie działać.
Teraz jest w stanie rozszerzyć stronę base.html.
źródło
Zobacz Łączenie ciągów w szablonach Django :
W przypadku wcześniejszych wersji Django:
{{ "Mary had a little"|stringformat:"s lamb." }}
Jeszcze:
{{ "Mary had a little"|add:" lamb." }}
źródło
Spójrz na
add
filtr .Edycja: możesz łączyć filtry, więc możesz to zrobić
"shop/"|add:shop_name|add:"/base.html"
. Ale to nie zadziała, ponieważ ocena szablonu w argumentach zależy od tagu szablonu, a rozszerzenie nie.Myślę, że nie możesz tego zrobić w szablonach.
źródło
Z dokumentów:
Tego znacznika można użyć na dwa sposoby:
{% extends "base.html" %}
(z cudzysłowami) używa wartości literału „base.html” jako nazwy szablonu nadrzędnego, który ma zostać rozszerzony.{% extends variable %}
używa wartości zmiennej. Jeśli zmienna ma wartość ciągu, Django użyje tego ciągu jako nazwy szablonu nadrzędnego. Jeśli zmienna zostanie przekształcona w obiekt szablonu, Django użyje tego obiektu jako szablonu nadrzędnego.Wygląda na to, że nie możesz użyć filtra do manipulowania argumentem. W widoku wywołującym musisz utworzyć instancję szablonu przodka lub utworzyć zmienną łańcuchową z poprawną ścieżką i przekazać ją z kontekstem.
źródło
Odpowiedź @ error jest zasadniczo poprawna, powinieneś do tego użyć tagu szablonu. Jednak wolę nieco bardziej ogólny tag szablonu, którego mogę używać do wykonywania wszelkiego rodzaju operacji podobnych do tego:
a następnie możesz użyć go w ten sposób w swoim szablonie:
Jak wspomniano w komentarzu, ten znacznik szablonu jest szczególnie użyteczny w przypadku informacji, które są powtarzalne w szablonie, ale wymagają logiki i innych rzeczy, które rozgromią twoje szablony lub w przypadkach, w których chcesz ponownie wykorzystać dane przekazywane między szablonami przez bloki:
i wtedy:
Kredyt na tag captureas należy się tutaj: https://www.djangosnippets.org/snippets/545/
źródło
Praca z
{% with %}
tagiem była dość kłopotliwa. Zamiast tego utworzyłem następujący znacznik szablonu, który powinien działać na ciągach i liczbach całkowitych.Następnie załaduj tag szablonu do szablonu u góry, korzystając z następujących czynności:
Następnie możesz użyć go w następujący sposób:
Osobiście uważam, że jest o wiele czystszy w pracy.
źródło
W szablonach django nie można manipulować zmiennymi. Masz dwie opcje: albo napisz własny tag szablonu, albo zrób to w widoku,
źródło
extends
nie ma na to możliwości. Umieść całą ścieżkę szablonu w zmiennej kontekstowej i użyj jej, lub skopiuj istniejący znacznik szablonu i odpowiednio go zmodyfikuj.źródło
I wiele konkatenacji:
I w szablonie:
źródło