django-admin中的站点配置

时间:2012-03-25 07:51:36

标签: python django django-admin

我的网站几乎没有全局配置。例如“smtp-server address”,“公司地址”等

我当然可以:

  1. settings.py中创建变量并在模板和应用中使用它;
  2. 创建一个模型(如Configuration)并在那里写下所有需要的字段。
  3. 如果我使用第一种方式,则无法在django-admin中提供更改此字段的权限。

    如果我使用秒方式它不是一个漂亮的解决方案,因为代码中的每个地方我都会使用model_name.objects.get(id=1)而我只需要一个实例。模型是为另一个任务创建的。

    我该如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

这就是我所做的。可能不是最理想的解决方案,但对我有用。

  1. 创建一个配置模型并按照您的要点执行所有常用操作2.创建一个函数(例如在configuration.view中),它将拉出并返回dict中的配置值。

  2. 现在在settings.py中,导入您的函数并将返回的dict设置为settings.py变量: CONFIG = configuration.view.get_config()

  3. 创建模板上下文处理器,在模板上下文中设置此CONFIG dict。

    def init_site_settings(request):
        return settings.CONFIG
    
  4. 将此上下文处理器添加到TEMPLATE_CONTEXT_PROCESSORS

  5. 现在,您可以将模板中的配置参数用作{{my_config_key}}

  6. 希望这有帮助。

答案 1 :(得分:3)

看看http://www.djangopackages.com/grids/g/live-setting/ 来自我的类​​似问题Changing Django settings at runtime

关于id = 1表示法,a)您可以在经理https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods上定义相应的属性 b)是的,它仍然是一个数据库查询 - 结账https://github.com/disqus/django-modeldict/,用于延迟访问和缓存的方法。

答案 2 :(得分:0)

对于你的选项2,硬编码的id = 1很糟糕,直接使用get()。因此你可以使用:

get_conf = lambda: model_name.objects.get()

还有其他需求的应用,例如http://bitbucket.org/bkroeze/django-livesettings/。你可能想检查一下。