【问题标题】:Using Django settings in templates [duplicate]在模板中使用 Django 设置 [重复]
【发布时间】:2011-03-26 17:15:08
【问题描述】:

我希望能够将某些配置信息放入我的 settings.py 文件中 - 例如站点名称、站点 URL 等。

如果这样做,我如何才能访问模板中的这些设置?

谢谢

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    假设在您的settings.py 文件中,您拥有:

    SITE_URL='www.mydomain.tld/somewhere/'
    SITE_NAME='My site'
    

    如果您只需要一两个视图:

    from django.shortcuts import render_to_response
    from django.conf import settings
    
    def my_view(request, ...):
        response_dict = {
            'site_name': settings.SITE_NAME,
            'site_url': settings.SITE_URL,
        }
        ...
        return render_to_response('my_template_dir/my_template.html', response_dict)
    

    如果您需要跨大量应用和/或视图访问这些,您可以编写上下文处理器来保存代码:

    詹姆斯对此有一个教程 online.

    本网站上提供了有关上下文处理器何时以及是否可用的一些有用信息 here.

    在您的 my_context_processors.py 文件中,您会:

    from django.conf import settings
    
    def some_context_processor(request):
        my_dict = {
            'site_url': settings.SITE_URL,
            'site_name': settings.SITE_NAME,
        }
    
        return my_dict
    

    回到你的settings.py,激活它:

    TEMPLATE_CONTEXT_PROCESSORS = (
        ...
    
        # yours
        'my_context_processors.some_context_processor',
    )
    

    在您的views.py 中,让视图像这样使用它:

    from django.shortcuts import render_to_response
    from django.template import RequestContext
    
    def my_view(request, ...):  
        response_dict = RequestContext(request)
        ...
        # you can still still add variables that specific only to this view
        response_dict['some_var_only_in_this_view'] = 42
        ...
        return render_to_response('my_template_dir/my_template.html', response_dict)
    

    【讨论】:

    • 我想在我的基本模板中使用这些设置,所有其他人都从这些模板中继承,我有点懒惰。有什么方法可以使默认行为使 render_to_response 使用 RequestContext 而不仅仅是 Context?如果可以的话,我不想在整个代码中继续添加相同的参数。
    • 您可以在 render_to_response 周围编写一个将 request 作为附加参数的包装函数,并在该函数中: tmp_dict=RequestContext(request), tmp_dict.update(response_dict) return render_to_response('...html ', tmp_dict) - 这可以让您更轻松地通过搜索和替换操作在任何地方更改代码
    • 太好了,谢谢大家。
    【解决方案2】:

    如果使用基于类的视图:

    #
    # in settings.py
    #
    YOUR_CUSTOM_SETTING = 'some value'
    
    #
    # in views.py
    #
    from django.conf import settings #for getting settings vars
    
    class YourView(DetailView): #assuming DetailView; whatever though
    
        # ...
    
        def get_context_data(self, **kwargs):
    
            context = super(YourView, self).get_context_data(**kwargs)
            context['YOUR_CUSTOM_SETTING'] = settings.YOUR_CUSTOM_SETTING
    
            return context
    
    #
    # in your_template.html, reference the setting like any other context variable
    #
    {{ YOUR_CUSTOM_SETTING }}
    

    【讨论】:

      【解决方案3】:

      如果您只需要为几个视图设置一两个设置,上下文处理器可能会有点过分,因为它会将它们添加到您应用中的所有视图中。但如果它在很多模板中使用,Contest Processor 是不错的选择。

      对于简单的一次性情况,只需将您需要的任何设置从视图传递到模板:

      from django.conf import settings
      from django.shortcuts import render_to_response
      
      def some_view(request):
          val = settings.SAVED_SETTING
          return render_to_response("index.html", {
              'saved_setting':val
          })
      

      并通过以下方式访问模板中的设置:

      {{ saved_setting }}
      

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 2013-06-11
        • 2015-12-08
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多