2011-02-02 3 views
0

J'ai un site Django, et j'aimerais permettre à un couple de paramètres du site à l'échelle:Django: Autoriser l'utilisateur admin à modifier les paramètres à l'échelle du site?

ADMIN_EMAIL - email address for an administrative user 
REMINDER_TEXT - email text for an email that the site will generate once a week 

à éditer dans l'interface d'administration.

Quelle est la façon la plus sensée de faire cela? Devrais-je stocker ces valeurs dans settings.py, ou quelque part dans la base de données?

This previous SO question seems to be related, mais je ne pense pas qu'il a jamais été entièrement répondu.

Merci!

Répondre

1

Idéalement, settings.py doit être accédé très rarement, car chaque accès consiste à exposer des données importantes (mot de passe db par exemple). Donc, le meilleur endroit pour stocker des paramètres supplémentaires est certainement une table de base de données - un tableau à deux colonnes, avec la clé de paramètres et les données de paramètres réels suffira.

+1

Merci. Une idée de comment je pourrais désactiver le bouton 'ajouter nouveau' dans l'admin de Django - c'est-à-dire comment je pourrais faire de ce champ un modèle qui ne contient qu'une seule entrée? – AP257

+0

Tard à la fête, et j'espère vraiment que vous avez résolu cela avant maintenant.Pour la postérité, vous pouvez supprimer l'accès à "créer" en désactivant la permission ' | | Peut ajouter 'pour le groupe ou l'utilisateur concerné. – melwil

0

Il y a quelques applications, qui permet aux administrateurs de django définir et utiliser certains paramètres par l'ensemble du site ... L'une de ces applications telles (que j'ai utilisé) est dbsettings ...

dbsettings applicaton...

1

J'ai essayé dbsettings (ainsi que la nouvelle fourchette sur github), et ils sont utiles - mais un peu trop lourd pour mes besoins. Au lieu de cela, j'ai implémenté une méthode plus simple. Je l'ai fait en utilisant un JSONField (à partir de Postgres 9.3) - mais vous pouvez utiliser un TextField (utilisez max_length = 1000 ou somesuch) car il est plus simple d'expliquer aux gens comment entrer une chaîne au lieu de JSON:

1) Tout d'abord, construire votre propre modèle Paramètres (peut-être dans le noyau/models.py):

class Setting(models.Model): 
    """ 
    Model for site-wide settings. 
    """ 
    name = models.CharField(max_length=200, help_text="Name of site-wide variable") 
    value = JSONField(null=True, blank=True, help_text="Value of site-wide variable that scripts can reference - must be valid JSON") 

    def __unicode__(self): 
     return self.name 

2) Ensuite, ajoutez une interface d'administration (dans le noyau/admin.py):

class SettingAdmin(admin.ModelAdmin): 
    list_display = ['name', 'value'] 

admin.site.register(Setting, SettingAdmin) 

3) Créez et exécutez vos migrations:

python manage.py schemamigration core --auto 
python manage.py migrate core 

4) Ajouter à la partie supérieure de base.html:

<script type="text/javascript"> 
    //Auto-exported site-wide settings 
    {% autoescape off %}var site_settings = {{ settings|safe|default:"{}" }};{% endautoescape %} 
</script> 

5) construire un 'injecteur' qui ajoute le code à chaque demande (probablement en noyau/contextprocessors.py)

from models import Setting 
import json 

def app_settings(request): 
    """Global values to pass to templates""" 
    settings_dict = dict() 
    settings = dict() 
    for obj in Setting.objects.all(): 
     settings[obj.name] = obj.value 
    settings_dict['settings'] = json.dumps(settings) 
    return settings_dict 

5) Ensuite, ajoutez les processeurs de contexte à votre site settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ..., 
    '<yourapp>.core.contextprocessors.app_settings', 
) 

6) Connectez-vous à votre page d'administration via un navigateur et crea Té un paramètre:

http://yoursite/admin/core/setting/ 
Add a new setting, something like: 
    cell_status_colors 
with a value of: 
    ["green","red"] (note this has to be valid JSON, so use quotes around strings) 

or: 
    daily_header 
with a value of: 
    {"text":"Tomorrow only, free shipping!"} 

7) Et enfin, devrait être en mesure d'appeler chacun de vos fichiers javascript via ces JS standard:

var colors = site_settings.cell_status_colors || ["green","red"]; 
var msg_text = site_settings.daily_header || {"text":""}; 
Questions connexes