【问题标题】:Django: Allow admin user to edit site-wide settings?Django:允许管理员用户编辑站点范围的设置?
【发布时间】:2011-06-20 01:46:04
【问题描述】:

我有一个 Django 站点,我想允许几个站点范围的设置:

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

在管理界面中编辑。

这样做最明智的方法是什么?我应该将这些值存储在settings.py 还是数据库中的某个位置?

This previous SO question seems to be related,但我认为它从未被完全回答。

谢谢!

【问题讨论】:

    标签: django django-settings


    【解决方案1】:

    我已经尝试过 dbsettings(以及它在 github 上的新分支),它们很有用 - 但对我的需求来说有点太重了。相反,我实现了一个更简单的方法。我使用 JSONField(来自 Postgres 9.3)来完成 - 但您可能更喜欢使用 TextField(使用 max_length=1000 或类似的),因为它更容易向人们解释如何输入字符串而不是 JSON:

    1) 首先,构建自己的设置模型(可能在 core/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) 然后,添加一个管理界面(在 core/admin.py 中):

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

    3) 构建并运行您的迁移:

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

    4) 添加到base.html的顶部:

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

    5) 构建一个“注入器”,为每个请求添加代码(可能在 core/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) 然后,将上下文处理器添加到您的站点 settings.py:

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

    6) 通过浏览器登录您的管理页面并创建设置:

    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) 最后,您的每个 javascript 文件都应该能够通过标准 JS 调用它们:

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

    【讨论】:

      【解决方案2】:

      理想情况下,settings.py 必须很少被访问,因为每次访问都包括暴露重要数据(例如数据库密码)。所以存储额外设置的最佳位置肯定是数据库表 - 一个两列的表,带有设置键和实际设置数据就足够了。

      【讨论】:

      • 谢谢。知道如何禁用 Django 管理员中的“添加新”按钮 - 即如何将其设为仅包含一个条目的模型字段?
      • 聚会迟到了,我真的希望你早点解决这个问题。对于后代,您可以通过禁用相关组或用户的权限 &lt;app&gt; | &lt;model&gt; | Can add &lt;model&gt; 来删除对“创建”的访问权限。
      【解决方案3】:

      有一些应用程序允许 django 管理员通过站点范围定义和使用一些设置...其中一个应用程序(我使用的)是 dbsettings...

      dbsettings applicaton...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 2015-01-01
        相关资源
        最近更新 更多