Ich habe einige Einstellungen in settings.py, auf die ich über eine Vorlage zugreifen möchte, aber ich kann nicht herausfinden, wie das geht. Ich habe es schon versucht
{{CONSTANT_NAME}}
aber das scheint nicht zu funktionieren. Ist das möglich?
django
django-templates
django-settings
Paul Wicks
quelle
quelle
Antworten:
Django bietet Zugriff auf bestimmte, häufig verwendete Einstellungskonstanten für die Vorlage, z. B.
settings.MEDIA_URL
und einige der Spracheinstellungen, wenn Sie die in Django integrierten generischen Ansichten verwenden oder ein Schlüsselwortargument für eine Kontextinstanz in derrender_to_response
Verknüpfungsfunktion übergeben. Hier ist ein Beispiel für jeden Fall:Diese Ansichten verfügen beide über mehrere häufig verwendete Einstellungen, wie
settings.MEDIA_URL
sie für die Vorlage verfügbar sind{{ MEDIA_URL }}
, usw.Wenn Sie in den Einstellungen nach Zugriff auf andere Konstanten suchen, entpacken Sie einfach die gewünschten Konstanten und fügen Sie sie dem Kontextwörterbuch hinzu, das Sie in Ihrer Ansichtsfunktion verwenden:
Jetzt können Sie
settings.FAVORITE_COLOR
auf Ihre Vorlage als zugreifen{{ favorite_color }}
.quelle
django-settings-export
, um zu vermeiden, dass dieser Code in jeder Ansicht geschrieben werden muss.Wenn es sich um einen Wert handelt, den Sie für jede Anforderung und Vorlage haben möchten, ist die Verwendung eines Kontextprozessors besser geeignet.
Hier ist wie:
Erstellen Sie eine
context_processors.py
Datei in Ihrem App-Verzeichnis. Angenommen, ich möchte denADMIN_PREFIX_VALUE
Wert in jedem Kontext haben:Fügen Sie Ihren Kontextprozessor zu Ihrer Datei settings.py hinzu :
Verwenden Sie
RequestContext
in Ihrer Ansicht, um Ihre Kontextprozessoren zu Ihrer Vorlage hinzuzufügen. Dierender
Verknüpfung führt dies automatisch aus:und schließlich in Ihrer Vorlage:
quelle
context_process.py
direkt neben meinesettings.py
Datei gesetzt und"context_processors.admin_media"
zu meinerTEMPLATE_CONTEXT_PROCESSORS
Liste hinzugefügt . Möglicherweise möchten Sie Ihrer Antwort auch einen Hinweis hinzufügen, dass der Standardwert von TEMPLATE_CONTEXT_PROCESSORS nicht leer ist. Wenn also ein vorhandener Code einen der von diesen Standardkontextprozessoren festgelegten Werte verwendet, funktionieren diese nur, wenn Sie sie wieder hinzufügen explizit zur Liste.render
Verknüpfung verwenden, um zu vermeiden, dass RequestContext explizit eingeschlossen werden muss: docs.djangoproject.com/de/1.6/topics/http/shortcuts/#renderIch finde, der einfachste Ansatz ist ein einzelnes benutzerdefiniertes Vorlagen-Tag :
Verwendungszweck:
quelle
{% settings_value "DATABASES" %}
? Dieser Anwendungsfall sollte deutlich machen, warum Einstellungen in Vorlagen zunächst nicht verfügbar sind.templatetags
Ordner in Ihrer App mit einer leeren__init__.py
Datei und diesem Code wiesettings.py
in diesem Ordner erstellen . 2) In Ihrer Vorlage fügen Sie{% load settings %}
Ihr neues Tag hinzu und verwenden es dann!Check out
django-settings-export
(Haftungsausschluss: Ich bin der Autor dieses Projekts).Zum Beispiel...
settings.py
template.html
quelle
render
und nichtrender_to_response
Eine andere Möglichkeit, dies zu tun, besteht darin, ein benutzerdefiniertes Vorlagen-Tag zu erstellen, mit dem Sie Werte aus den Einstellungen herausfischen können.
Sie können dann verwenden:
um es auf einer beliebigen Seite zu drucken, ohne durch Kontextprozessor-Rahmen zu springen.
quelle
Ich mag Berislavs Lösung, weil sie auf einfachen Websites sauber und effektiv ist. Was ich NICHT mag, ist, alle Einstellungskonstanten wohl oder übel freizulegen. Am Ende habe ich also Folgendes gemacht:
Verwendungszweck:
Dies schützt alle Konstanten, die Sie nicht benannt haben, vor der Verwendung in der Vorlage. Wenn Sie wirklich ausgefallen sein möchten, können Sie in den Einstellungen ein Tupel festlegen und einfach mehr als ein Vorlagen-Tag für verschiedene Seiten, Apps oder Bereiche erstellen Kombinieren Sie nach Bedarf ein lokales Tupel mit dem Einstellungstupel und führen Sie dann das Listenverständnis durch, um festzustellen, ob der Wert akzeptabel ist.
Ich bin damit einverstanden, dass dies auf einer komplexen Site etwas simpel ist, aber es gibt Werte, die universell in Vorlagen zu finden wären, und dies scheint gut zu funktionieren. Danke an Berislav für die ursprüngliche Idee!
quelle
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
istFalse
, nicht hier String Problem.if
Anweisung verwenden? Ich möchte denDEBUG
Wert überprüfenIch habe die Antwort von chrisdew verbessert (um ein eigenes Tag zu erstellen) ein wenig .
Erstellen Sie zunächst die Datei,
yourapp/templatetags/value_from_settings.py
in der Sie Ihr eigenes neues Tag definierenvalue_from_settings
:Sie können dieses Tag in Ihrer Vorlage verwenden über:
oder über
Der Vorteil der
as ...
Notation ist, dass dies die Verwendung inblocktrans
Blöcken über eine einfache macht{{my_fqdn}}
.quelle
Hinzufügen einer Antwort mit vollständigen Anweisungen zum Erstellen eines benutzerdefinierten Vorlagen-Tags, das dies mit Django 2.0+ löst
Erstellen Sie in Ihrem App-Ordner einen Ordner namens templatetags . Erstellen Sie darin __init__.py und custom_tags.py :
Im custom_tags.py eine benutzerdefinierten Tag - Funktion erstellen, die den Zugriff auf eine beliebige Taste in der bietet Einstellungen konstant:
Um diesen Code zu verstehen, empfehle ich, den Abschnitt über einfache Tags in den Django-Dokumenten zu lesen .
Anschließend müssen Sie Django auf dieses (und jedes zusätzliche) benutzerdefinierte Tag aufmerksam machen, indem Sie diese Datei in eine beliebige Vorlage laden, in der Sie sie verwenden möchten. Genau wie Sie das eingebaute statische Tag laden müssen:
Wenn es geladen ist, kann es wie jedes andere Tag verwendet werden. Geben Sie einfach die spezifische Einstellung an, die Sie zurückgeben möchten. Wenn Sie also eine BUILD_VERSION-Variable in Ihren Einstellungen haben:
Diese Lösung funktioniert nicht mit Arrays, aber wenn Sie dies benötigen, setzen Sie möglicherweise zu viel Logik in Ihre Vorlagen ein.
Hinweis: Eine sauberere und ausfallsichere Lösung besteht wahrscheinlich darin, einen benutzerdefinierten Kontextprozessor bereitzustellen, in dem Sie die erforderlichen Einstellungen zu einem Kontext hinzufügen, der allen Vorlagen zur Verfügung steht. Auf diese Weise verringern Sie das Risiko, versehentlich vertrauliche Einstellungen in Ihren Vorlagen auszugeben.
quelle
Fügen Sie diesen Code einer Datei mit dem Namen hinzu
context_processors.py
:Fügen Sie dann in Ihre Einstellungsdatei einen Pfad wie
'speedy.core.base.context_processors.settings'
(mit Ihrem App-Namen und Pfad) in die'context_processors'
Einstellungen in einTEMPLATES
.(Sie können zum Beispiel settings / base.py und context_processors.py sehen ).
Anschließend können Sie die spezifische Einstellung in einem beliebigen Vorlagencode verwenden. Zum Beispiel:
Update: Der obige Code macht alle Einstellungen für Vorlagen verfügbar, einschließlich vertraulicher Informationen wie Ihrer
SECRET_KEY
. Ein Hacker könnte diese Funktion missbrauchen, um solche Informationen in den Vorlagen anzuzeigen. Wenn Sie nur bestimmte Einstellungen für die Vorlagen verfügbar machen möchten, verwenden Sie stattdessen diesen Code:quelle
SECRET_KEY
. Ein Hacker könnte diese Funktion missbrauchen, um solche Informationen in den Vorlagen anzuzeigen.Das obige Beispiel von bchhun ist nett, außer dass Sie Ihr Kontextwörterbuch explizit aus settings.py erstellen müssen. Unten finden Sie ein UNTESTED-Beispiel, wie Sie das Kontextwörterbuch automatisch aus allen Großbuchstabenattributen von settings.py erstellen können (bezüglich: "^ [A-Z0-9 _] + $").
Am Ende von settings.py:
quelle
Wenn jemand diese Frage so findet wie ich, werde ich meine Lösung veröffentlichen, die auf Django 2.0 funktioniert:
Dieses Tag weist der Variablen der Vorlage einige Werte für die Variablen settings.py zu:
Verwendungszweck:
{% get_settings_value template_var "SETTINGS_VAR" %}
app / templatetags / my_custom_tags.py:
Ihre Vorlage:
Weitere Informationen zum Erstellen benutzerdefinierter Vorlagen-Tags finden Sie in der Dokumentation von Django: https://docs.djangoproject.com/de/2.0/howto/custom-template-tags/
quelle
{% if settings_debug %}
{% if settings_debug == True %}
zu Ihrem Vorschlag{% if settings_debug %}
Bei Verwendung einer klassenbasierten Ansicht:
quelle
Ich fand, dass dies der einfachste Ansatz für Django 1.3 ist:
views.py
hero.html
quelle
Sowohl IanSR als auch bchhun schlugen vor, TEMPLATE_CONTEXT_PROCESSORS in den Einstellungen zu überschreiben. Beachten Sie, dass diese Einstellung eine Standardeinstellung hat, die einige Probleme verursachen kann, wenn Sie sie überschreiben, ohne die Standardeinstellungen neu festzulegen. Die Standardeinstellungen haben sich auch in den letzten Versionen von Django geändert.
https://docs.djangoproject.com/de/1.3/ref/settings/#template-context-processors
Die Standardwerte für TEMPLATE_CONTEXT_PROCESSORS:
quelle
Wenn wir Kontext- und Vorlagen-Tags für eine einzelne Variable vergleichen, könnte es von Vorteil sein, die effizientere Option zu kennen. Es ist jedoch möglicherweise besser, nur in Vorlagen einzutauchen, die diese Variable benötigen. In diesem Fall ist es nicht sinnvoll, die Variable an alle Vorlagen zu übergeben. Wenn Sie die Variable jedoch in eine allgemeine Vorlage wie die base.html-Vorlage senden, spielt dies keine Rolle, da die base.html-Vorlage bei jeder Anforderung gerendert wird, sodass Sie beide Methoden verwenden können.
Wenn Sie sich für die Option "Vorlagen-Tags" entscheiden, verwenden Sie den folgenden Code, um einen Standard zu übergeben können, nur für den Fall, dass die betreffende Variable undefiniert war.
Beispiel: get_from_settings my_variable als my_context_value
Beispiel: get_from_settings my_variable my_default als my_context_value
quelle
SITE_EXTRA_CONTEXT_DICT
in der Finalware verwenden , um dies für Sie zu tun.