Définition des Constantes dans Django
Je veux avoir certaines constantes dans un Django Projets. Par exemple, disons une constante appelée MIN_TIME_TEST
.
Je voudrais être en mesure d'accéder à cette constante dans deux endroits: à partir de l'intérieur de mon code Python, et à partir de n'importe quel des Modèles de.
Quelle est la meilleure façon de faire cela?
EDIT:
Pour clarifier, je sais à propos de Modèle de Contexte Processeurs et sur la juste mettre les choses en settings.py ou dans un autre fichier et simplement l'importation.
Ma question est, comment puis-je combiner les deux approches, sans violer le "Don't Repeat Yourself" règle? Sur la base des réponses jusqu'à présent, voici ma démarche:
J'aimerais créer un fichier appelé global_constants.py qui aura une liste de constantes (des choses comme MIN_TIME_TEST = 5
). Je peux import
ce fichier dans n'importe quel module pour obtenir les constantes.
Mais maintenant, je veux créer le contexte du processeur qui retourne l'ensemble de ces constantes. Comment puis-je faire cela automatiquement, sans avoir à les énumérer à nouveau dans un dictionnaire, comme dans Jean Mee réponse?
OriginalL'auteur Edan Maor | 2010-10-28
Vous devez vous connecter pour publier un commentaire.
Les deux Luper et Vladimir sont corrects à mon humble avis, mais vous aurez besoin des deux pour compléter vos exigences.
Bien que, les constantes ne pas besoin pour être dans la settings.py, vous pouvez les placer n'importe où et de les importer à partir de ce lieu dans votre vue/modèle/module de code. J'ai parfois de les mettre dans le
__init__.py
si je n'aime pas à avoir à être considérées comme pertinentes à l'échelle mondiale.un contexte processeur comme ceci permettra de s'assurer que les variables sélectionnées sont globalement dans le modèle portée
Mais c'est peut-être exagéré si vous êtes nouveau à django, peut-être vous êtes juste demander comment mettre des variables dans le modèle de champ...?
Envelopper le tout dans un dictionnaire, puis mettre le dictionnaire dans son contexte. Vous pourrez y accéder via la notation point. par exemple: {{yourDict.yourConstant}}
OriginalL'auteur John Mee
De construire sur les réponses des autres, voici une façon simple que vous mettriez ce:
Dans votre fichier de paramètres:
Puis, profitant de Jean-Mee contexte du processeur:
Cela permettra de résoudre le SEC problème.
Ou, si vous ne prévoyez d'utiliser les paramètres globaux de temps en temps et envie de les appeler à partir de l'intérieur de la vue:
OriginalL'auteur Jordan Reiter
Envisager de mettre en settings.py de votre application. Bien sûr, afin de l'utiliser dans le modèle, vous aurez besoin pour le rendre disponible à un modèle comme toute autre habitude variable.
OriginalL'auteur devmiles.com
Utilisation contexte processeurs avoir vos constantes disponibles dans tous les modèles (à l'settings.py est un endroit agréable pour les définir comme Vladimir a dit).
Toutes les informations sont disponibles sur la page Luper Rouch liés. Vous devez créer une fonction python qui permet de renvoyer un dictionnaire de vars (c'est là que vous revenez à votre constantes) et la liste de votre fonction dans TEMPLATE_CONTEXT_PROCESSORS réglage.
OriginalL'auteur Luper Rouch
Contexte processeurs sont mieux adaptés à la manipulation d'objet dynamique des données--ils sont définis comme un mappage dans le la documentation et, dans de nombreux posts ici ils sont en cours de modification ou passé autour de points de vue--il n'est pas logique qu'un modèle peut perdre l'accès à l'information mondiale, parce que, par exemple, vous avez oublié d'utiliser spécialisée contexte du processeur dans la vue. Les données sont globales, par définition, & que les couples à la vue du modèle.
Une meilleure façon est de définir un modèle personnalisé de la balise. De cette façon:
Dans l'exemple ci-dessous, j'ai traiter votre problème de chargement dans ce MIN_TIME_TEST variable, et un problème que j'ai souvent le visage, le chargement dans les Url que lorsque mon environnement change.
J'ai 4 environnements--2 dev et 2 production:
Je le fais sur tous mes projets & garder toutes les url dans un fichier, global_settings.py il est donc accessible à partir du code. Je définir un modèle personnalisé de la balise {% site_url %} qui peuvent être (éventuellement) chargé dans n'importe quel modèle
J'ai créer une application appelée global_settings, et assurez-vous qu'il est inclus dans mes paramètres.INSTALLED_APPS tuple.
Django compile basé sur un modèle de texte dans des nœuds avec une méthode render() qui raconte comment les données doivent être affichées--j'ai créé un objet qui rend les données par returnning valeurs dans mon global_settings.py basé sur le nom passé en.
Il ressemble à ceci:
Maintenant, dans global_settings.py -je m'inscrire à un couple tags: site_url pour mon exemple, et min_test_time pour votre exemple. De cette façon, lorsque {% min_time_test %} est appelé à partir d'un modèle, il va appeler get_min_time_test qui décide de charger dans la valeur=5. Dans mon exemple, {% site_url %} va faire un nom-fonction de recherche de sorte que je peux conserver tous les 4 Url définies à la fois et de choisir dans quel environnement j'utilise. C'est plus souple pour moi qu'à l'aide de Django reinhardt, construit dans les paramètres.Debug=True/False flag.
Noter que pour que cela fonctionne, django attend global_settings.py être situé dans un python emballés appelé templatetags sous votre Django app. Mon Django app est appelé ici global_settings, donc ma structure de répertoire ressemble à:
/project-name/global_settings/templatetags/global_settings.py
etc.
Finalement, le modèle choisit de charger dans les paramètres globaux ou pas, ce qui est bénéfique pour la performance. Ajoutez cette ligne à votre modèle pour afficher tous les tags inscrits dans global_settings.py:
Maintenant, d'autres projets qui ont besoin d'MIN_TIME_TEST ou ces environnements exposés suffit d'installer cette application =)
OriginalL'auteur Alan Illing
Dans le contexte du processeur, vous pouvez utiliser quelque chose comme:
OriginalL'auteur andrei1089
Variante sur Jean-Mee de la dernière partie, avec un peu d'élaboration sur la même idée de la Jordanie Reiter discute.
Supposons que vous avez quelque chose dans vos paramètres apparente à ce que la Jordanie a proposé, en d'autres termes, quelque chose comme:
Supposons, en outre, vous disposez déjà d'un dictionnaire avec certaines des variables que vous souhaitez passer votre modèle, peut-être passés comme arguments à votre vue. Appelons ça de la
my_dict
. Supposons que vous voulez les valeurs dans my_dict pour remplacer ceux de lasettings.GLOBAL_SETTINGS
dictionnaire.Vous pourriez faire quelque chose de votre point de vue comme:
Cela vous permet d'avoir les paramètres déterminés à l'échelle mondiale, à la disposition de vos modèles, et ne vous obligent pas à taper manuellement chacun d'entre eux.
Si vous ne pas avez d'autres variables à passer le modèle, ni aucune nécessité de les remplacer, il vous suffit de faire:
La principale différence entre ce que je suis en train de parler ici & ce que la Jordanie a, c'est que pour sa,
settings.GLOBAL_SETTINGS
remplace tout ce qu'il peut avoir en commun w/votre contexte dictionnaire, et avec le mien, mon contexte dictionnaire remplacesettings.GLOBAL_SETTINGS
. YMMV.OriginalL'auteur desfido