J'ai des éléments dans settings.py auxquels j'aimerais pouvoir accéder à partir d'un modèle, mais je ne sais pas comment le faire. J'ai déjà essayé
{{CONSTANT_NAME}}
mais cela ne semble pas fonctionner. Est-ce possible?
django
django-templates
django-settings
Paul Wicks
la source
la source
Réponses:
Django fournit un accès à certaines constantes de paramètres fréquemment utilisées du modèle, telles que
settings.MEDIA_URL
certains des paramètres de langue, si vous utilisez les vues génériques intégrées de django ou passez un argument de mot-clé d'instance de contexte dans larender_to_response
fonction de raccourci. Voici un exemple de chaque cas:Ces vues auront toutes deux plusieurs paramètres fréquemment utilisés comme
settings.MEDIA_URL
disponibles pour le modèle en tant que{{ MEDIA_URL }}
, etc.Si vous recherchez l'accès à d'autres constantes dans les paramètres, décompressez simplement les constantes que vous souhaitez et ajoutez-les au dictionnaire de contexte que vous utilisez dans votre fonction d'affichage, comme ceci:
Maintenant, vous pouvez accéder
settings.FAVORITE_COLOR
à votre modèle en tant que{{ favorite_color }}
.la source
django-settings-export
pour éviter d'avoir à écrire ce code dans chaque vue.Si c'est une valeur que vous souhaitez avoir pour chaque demande et modèle, l'utilisation d'un processeur de contexte est plus appropriée.
Voici comment:
Créez un
context_processors.py
fichier dans le répertoire de votre application. Disons que je veux avoir laADMIN_PREFIX_VALUE
valeur dans tous les contextes:ajoutez votre processeur de contexte à votre fichier settings.py :
Utilisez
RequestContext
à votre avis pour ajouter vos processeurs de contexte dans votre modèle. Lerender
raccourci le fait automatiquement:et enfin, dans votre modèle:
la source
context_process.py
juste à côté de monsettings.py
dossier et ajouté"context_processors.admin_media"
à maTEMPLATE_CONTEXT_PROCESSORS
liste. En outre, vous souhaiterez peut-être ajouter une note dans votre réponse sur le fait que la valeur par défaut de TEMPLATE_CONTEXT_PROCESSORS n'est pas vide, donc si un code existant utilise l'une des valeurs définies par ces processeurs de contexte par défaut, ils ne fonctionneront pas sauf si vous les ajoutez à nouveau à la liste explicitement.render
raccourci pour éviter d'avoir à inclure explicitement RequestContextJe trouve l'approche la plus simple étant une seule balise de modèle personnalisée :
Usage:
la source
{% settings_value "DATABASES" %}
:? Ce cas d'utilisation devrait rendre évident pourquoi les paramètres ne sont pas disponibles dans les modèles pour commencer.templatetags
dossier dans votre application avec un__init__.py
fichier vide et ce code commesettings.py
dans ce dossier. 2) dans votre modèle, vous ajoutez{% load settings %}
puis utilisez votre nouvelle balise!Check out
django-settings-export
(avertissement: je suis l'auteur de ce projet).Par exemple...
settings.py
template.html
la source
render
et nonrender_to_response
Une autre façon de procéder consiste à créer une balise de modèle personnalisée qui peut vous permettre de pêcher des valeurs hors des paramètres.
Vous pouvez ensuite utiliser:
pour l'imprimer sur n'importe quelle page, sans passer par des cercles de processeur de contexte.
la source
J'aime la solution de Berislav, car sur des sites simples, elle est propre et efficace. Ce que je n'aime pas, c'est exposer toutes les constantes de paramètres à volonté. Donc ce que j'ai fini par faire, c'est ceci:
Usage:
Cela protège toutes les constantes que vous n'avez pas nommées de l'utilisation dans le modèle, et si vous vouliez vraiment devenir fantaisiste, vous pouvez définir un tuple dans les paramètres et créer plus d'une balise de modèle pour différentes pages, applications ou zones, et simplement combiner un tuple local avec le tuple de paramètres selon les besoins, puis faire la compréhension de la liste pour voir si la valeur est acceptable.
Je suis d'accord, sur un site complexe, c'est un peu simpliste, mais il y a des valeurs qui seraient bien d'avoir universellement dans les modèles, et cela semble bien fonctionner. Merci à Berislav pour l'idée originale!
la source
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
estFalse
, sousChaîne aucun problème ici.if
déclaration? je veux vérifier laDEBUG
valeurJ'ai un peu amélioré la réponse de chrisdew (pour créer votre propre tag).
Créez d'abord le fichier
yourapp/templatetags/value_from_settings.py
dans lequel vous définissez votre propre nouvelle balisevalue_from_settings
:Vous pouvez utiliser cette balise dans votre modèle via:
ou via
L'avantage de la
as ...
notation est qu'elle facilite son utilisation dans lesblocktrans
blocs via un simple{{my_fqdn}}
.la source
Ajouter une réponse avec des instructions complètes pour créer une balise de modèle personnalisée qui résout ce problème, avec Django 2.0+
Dans votre dossier d'application, créez un dossier appelé templatetags . Dans celui-ci, créez __init__.py et custom_tags.py :
Dans custom_tags.py, créez une fonction de balise personnalisée qui donne accès à une clé arbitraire dans la constante des paramètres :
Pour comprendre ce code, je recommande de lire la section sur les balises simples dans la documentation Django.
Ensuite, vous devez informer Django de cette balise personnalisée (et de toute balise supplémentaire) en chargeant ce fichier dans n'importe quel modèle où vous l'utiliserez. Tout comme vous devez charger la balise statique intégrée:
Une fois chargé, il peut être utilisé comme n'importe quelle autre balise, il suffit de fournir le paramètre spécifique que vous devez renvoyer. Donc, si vous avez une variable BUILD_VERSION dans vos paramètres:
Cette solution ne fonctionnera pas avec les tableaux, mais si vous en avez besoin, vous pourriez mettre trop de logique dans vos modèles.
Remarque: Une solution plus propre et plus sûre serait probablement de créer un processeur de contexte personnalisé dans lequel vous ajoutez les paramètres dont vous avez besoin à un contexte disponible pour tous les modèles. De cette façon, vous réduisez le risque de sortie des paramètres sensibles dans vos modèles par erreur.
la source
Ajoutez ce code à un fichier appelé
context_processors.py
:Et puis, dans votre fichier de paramètres, incluez un chemin tel que
'speedy.core.base.context_processors.settings'
(avec le nom et le chemin de votre application) dans les'context_processors'
paramètres deTEMPLATES
.(Vous pouvez voir par exemple settings / base.py et context_processors.py ).
Ensuite, vous pouvez utiliser le paramètre spécifique dans n'importe quel code de modèle. Par exemple:
Mise à jour: le code ci-dessus expose tous les paramètres aux modèles, y compris les informations sensibles telles que la vôtre
SECRET_KEY
. Un pirate pourrait abuser de cette fonctionnalité pour afficher ces informations dans les modèles. Si vous souhaitez exposer uniquement des paramètres spécifiques aux modèles, utilisez plutôt ce code:la source
SECRET_KEY
. Un pirate pourrait abuser de cette fonctionnalité pour afficher une telle information dans les modèles.L'exemple ci-dessus de bchhun est agréable, sauf que vous devez créer explicitement votre dictionnaire de contexte à partir de settings.py. Vous trouverez ci-dessous un exemple non testé de la façon dont vous pouvez créer automatiquement le dictionnaire de contexte à partir de tous les attributs en majuscules de settings.py (re: "^ [A-Z0-9 _] + $").
À la fin de settings.py:
la source
Si quelqu'un trouve cette question comme je l'ai fait, alors je posterai ma solution qui fonctionne sur Django 2.0:
Cette balise attribue une valeur de variable settings.py à la variable du modèle:
Usage:
{% get_settings_value template_var "SETTINGS_VAR" %}
app / templatetags / my_custom_tags.py:
Votre modèle:
Voir la documentation de Django pour créer des balises de modèle personnalisées ici: https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
la source
{% if settings_debug %}
{% if settings_debug == True %}
à votre suggestion{% if settings_debug %}
Si vous utilisez une vue basée sur une classe:
la source
J'ai trouvé que c'était l'approche la plus simple pour Django 1.3:
views.py
hero.html
la source
IanSR et bchhun ont suggéré de remplacer TEMPLATE_CONTEXT_PROCESSORS dans les paramètres. Sachez que ce paramètre a une valeur par défaut qui peut provoquer des problèmes si vous le remplacez sans réinitialiser les valeurs par défaut. Les valeurs par défaut ont également changé dans les versions récentes de Django.
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
TEMPLATE_CONTEXT_PROCESSORS par défaut:
la source
Si nous devions comparer le contexte et les balises de modèle sur une seule variable, alors connaître l'option la plus efficace pourrait être bénéfique. Cependant, il serait préférable de plonger dans les paramètres uniquement à partir de modèles qui ont besoin de cette variable. Dans ce cas, cela n'a aucun sens de passer la variable dans tous les modèles. Mais si vous envoyez la variable dans un modèle commun tel que le modèle base.html, cela n'aurait pas d'importance car le modèle base.html est rendu à chaque demande, vous pouvez donc utiliser les deux méthodes.
Si vous décidez d'utiliser l'option de balises de modèle, utilisez le code suivant car il vous permet de passer une valeur par défaut dans, juste au cas où la variable en question n'était pas définie.
Exemple: get_from_settings my_variable as my_context_value
Exemple: get_from_settings my_variable my_default as my_context_value
la source
SITE_EXTRA_CONTEXT_DICT
dans le logiciel final pour le faire pour vous.