Mam pewne ustawienia w pliku settings.py, do których chciałbym uzyskać dostęp z szablonu, ale nie wiem, jak to zrobić. Już próbowałem
{{CONSTANT_NAME}}
ale to nie działa. czy to możliwe?
django
django-templates
django-settings
Paul Wicks
źródło
źródło
Odpowiedzi:
Django zapewnia dostęp do pewnych, często używanych stałych ustawień szablonu, takich jak
settings.MEDIA_URL
niektóre ustawienia języka, jeśli używasz wbudowanych widoków ogólnych django lub przekazujesz argumentrender_to_response
funkcji kontekstowej słowa kluczowego w funkcji skrótu. Oto przykład każdego przypadku:Te widoki będą miały kilka często używanych ustawień, takich jak
settings.MEDIA_URL
dostępne dla szablonu jako{{ MEDIA_URL }}
itp.Jeśli szukasz dostępu do innych stałych w ustawieniach, po prostu rozpakuj wybrane stałe i dodaj je do słownika kontekstowego, którego używasz w funkcji widoku, w następujący sposób:
Teraz możesz uzyskać dostęp
settings.FAVORITE_COLOR
do swojego szablonu jako{{ favorite_color }}
.źródło
django-settings-export
się unikać konieczności pisania tego kodu w każdym widoku.Jeśli chcesz mieć wartość dla każdego żądania i szablonu, bardziej odpowiednie jest użycie procesora kontekstu .
Oto jak:
Utwórz
context_processors.py
plik w katalogu aplikacji. Powiedzmy, że chcę miećADMIN_PREFIX_VALUE
wartość w każdym kontekście:dodaj procesor kontekstowy do pliku settings.py :
Użyj
RequestContext
w widoku, aby dodać procesory kontekstowe do szablonu.render
Skrót robi to automatycznie:i wreszcie w szablonie:
źródło
context_process.py
tuż obok mojegosettings.py
pliku i dodałem"context_processors.admin_media"
do mojejTEMPLATE_CONTEXT_PROCESSORS
listy. Ponadto możesz dodać notatkę w odpowiedzi na temat faktu, że domyślna wartość TEMPLATE_CONTEXT_PROCESSORS nie jest pusta, więc jeśli jakikolwiek istniejący kod używa dowolnej wartości ustawionej przez te domyślne procesory kontekstowe, nie będą działać, chyba że dodasz je z powrotem do listy jawnie.render
skrótu, aby uniknąć konieczności jawnego dołączaniaUważam, że najprostszym podejściem jest pojedynczy niestandardowy tag szablonu :
Stosowanie:
źródło
{% settings_value "DATABASES" %}
:? Ten przypadek użycia powinien wyjaśnić, dlaczego ustawienia nie są dostępne w szablonach na początek.templatetags
folder w aplikacji z pustym__init__.py
plikiem i tym kodem jaksettings.py
w tym folderze. 2) w szablonie dodajesz,{% load settings %}
a następnie używasz nowego tagu!Sprawdź
django-settings-export
(zastrzeżenie: jestem autorem tego projektu).Na przykład...
settings.py
template.html
źródło
render
a nierender_to_response
Innym sposobem na to jest utworzenie niestandardowego znacznika szablonu, który pozwala wyłowić wartości z ustawień.
Następnie możesz użyć:
aby wydrukować go na dowolnej stronie, bez przeskakiwania przez pętle procesora kontekstowego.
źródło
Podoba mi się rozwiązanie Berislava, ponieważ na prostych stronach jest czyste i skuteczne. NIE podoba mi się ujawnianie wszystkich stałych ustawień willy-nilly. Skończyło się na tym, że:
Stosowanie:
Chroni to wszelkie stałe, które nie zostały nazwane przed użyciem w szablonie, a jeśli chcesz być naprawdę fantazyjny, możesz ustawić krotkę w ustawieniach i utworzyć więcej niż jeden znacznik szablonu dla różnych stron, aplikacji lub obszarów i po prostu w razie potrzeby połącz lokalną krotkę z krotką ustawień, a następnie przejrzyj listę, aby sprawdzić, czy wartość jest akceptowalna.
Zgadzam się, na złożonej stronie jest to nieco uproszczone, ale istnieją wartości, które dobrze byłoby mieć uniwersalnie w szablonach, i wydaje się, że działa to dobrze. Dzięki Berislav za oryginalny pomysł!
źródło
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
jestFalse
, nie ma podciąg problem tutaj.if
zestawieniu? Chcę sprawdzićDEBUG
wartośćPoprawiłem trochę odpowiedź chrisdew (aby utworzyć własny tag).
Najpierw utwórz plik,
yourapp/templatetags/value_from_settings.py
w którym zdefiniujesz swój własny tagvalue_from_settings
:Możesz użyć tego tagu w swoim szablonie poprzez:
lub przez
Zaletą tego
as ...
zapisu jest to, że dzięki temu można go łatwo używać wblocktrans
blokach{{my_fqdn}}
.źródło
Dodanie odpowiedzi z kompletnymi instrukcjami tworzenia niestandardowego znacznika szablonu, który rozwiązuje ten problem za pomocą Django 2.0+
W folderze aplikacji utwórz folder o nazwie szablony . W nim utwórz __init__.py i custom_tags.py :
W custom_tags.py utwórz niestandardową funkcję znacznika, która zapewnia dostęp do dowolnego klucza w stałej ustawień :
Aby zrozumieć ten kod, polecam przeczytanie sekcji o prostych tagach w dokumentach Django.
Następnie musisz poinformować Django o tym (i dowolnym dodatkowym) niestandardowym tagu, ładując ten plik do dowolnego szablonu, w którym go użyjesz. Tak jak musisz załadować wbudowany tag statyczny:
Po załadowaniu może być używany tak jak każdy inny tag, wystarczy podać określone ustawienie, które chcesz zwrócić. Więc jeśli masz zmienną BUILD_VERSION w swoich ustawieniach:
To rozwiązanie nie będzie działać z tablicami, ale jeśli jest to potrzebne, być może logujesz się w szablonach.
Uwaga: Bardziej czystym i bezpiecznym rozwiązaniem byłoby prawdopodobnie utworzenie niestandardowego procesora kontekstowego, w którym dodasz potrzebne ustawienia do kontekstu dostępne dla wszystkich szablonów. W ten sposób zmniejszasz ryzyko przypadkowego wprowadzenia wrażliwych ustawień w szablonach.
źródło
Dodaj ten kod do pliku o nazwie
context_processors.py
:A następnie w pliku ustawień dołącz ścieżkę, taką jak
'speedy.core.base.context_processors.settings'
(z nazwą i ścieżką aplikacji) w'context_processors'
ustawieniach wTEMPLATES
.(Możesz zobaczyć na przykład ustawienia / base.py i context_processors.py ).
Następnie możesz użyć określonego ustawienia w dowolnym kodzie szablonu. Na przykład:
Aktualizacja: powyższy kod udostępnia wszystkie ustawienia szablonów, w tym poufne informacje, takie jak Twoje
SECRET_KEY
. Haker może wykorzystać tę funkcję do wyświetlania takich informacji w szablonach. Jeśli chcesz udostępnić szablony tylko określone ustawienia, użyj tego kodu:źródło
SECRET_KEY
. Haker może wykorzystać tę funkcję do wyświetlenia takich informacji w szablonach.Powyższy przykład z bchhun jest ładny, z wyjątkiem tego, że musisz jawnie zbudować słownik kontekstowy z settings.py. Poniżej znajduje się NIETESTOWANY przykład, w jaki sposób można automatycznie zbudować słownik kontekstowy ze wszystkich dużych atrybutów settings.py (re: "^ [A-Z0-9 _] + $").
Na końcu settings.py:
źródło
Jeśli ktoś znajdzie to pytanie tak jak ja, opublikuję moje rozwiązanie, które działa na Django 2.0:
Ten znacznik przypisuje niektóre wartości zmiennej settings.py do zmiennej szablonu:
Stosowanie:
{% get_settings_value template_var "SETTINGS_VAR" %}
app / templatetags / my_custom_tags.py:
Twój szablon:
Zobacz dokumentację Django, jak tworzyć niestandardowe tagi szablonów tutaj: https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
źródło
{% if settings_debug %}
{% if settings_debug == True %}
na sugerowany{% if settings_debug %}
Jeśli używasz widoku klasowego:
źródło
Uważam, że jest to najprostsze podejście do Django 1.3:
views.py
hero.html
źródło
Zarówno IanSR, jak i bchhun zasugerowały zastąpienie TEMPLATE_CONTEXT_PROCESSORS w ustawieniach. Pamiętaj, że to ustawienie ma wartość domyślną, która może powodować pewne nieprzyjemne rzeczy, jeśli zastąpisz ją bez ponownego ustawienia wartości domyślnych. Domyślne ustawienia również uległy zmianie w ostatnich wersjach Django.
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
Domyślne TEMPLATE_CONTEXT_PROCESSORS:
źródło
Gdybyśmy porównali znaczniki kontekstu z szablonem na jednej zmiennej, znajomość bardziej wydajnej opcji może być korzystna. Lepiej jednak zanurzyć się w ustawieniach tylko z szablonów, które potrzebują tej zmiennej. W takim przypadku przekazanie zmiennej do wszystkich szablonów nie ma sensu. Ale jeśli wysyłasz zmienną do wspólnego szablonu, takiego jak szablon base.html, nie miałoby to znaczenia, ponieważ szablon base.html jest renderowany przy każdym żądaniu, więc możesz użyć dowolnej z metod.
Jeśli zdecydujesz się skorzystać z opcji tagów szablonów, użyj następującego kodu, ponieważ pozwala on przekazać wartość domyślną wartość , na wypadek, gdyby zmienna, o której mowa, była niezdefiniowana.
Przykład: get_from_settings moja_zmienna jako moja_kontekstowa wartość
Przykład: get_from_settings my_variable my_default as my_context_value
źródło
SITE_EXTRA_CONTEXT_DICT
w oprogramowaniu końcowym, aby zrobić to za Ciebie.