django2.0 全局变量的实现方法


发布时间:2019-02-15 13:08    作者: 晖哥哥   已过去:2 年,9 月   阅读总量:603 已被赞:0


在网站中,我们有很多的页面都需要使用导航条,但我们不可能每一个页面都传递一次这些变量,因此就需要使用全局变量,

什么叫全局变量,我们经常在html中使用{{ var }}这样的模板变量,这些变量是我们在视图函数中

提前定义好的变量,通过render()等方法传递到模板中。

但是,还有一类变量,我们并没有在views.py中定义,也能在html中使用该变量,像这样的变量,就叫做

全局变量。

下面来看看如何定义全局变量:

思路:

新建contexts.py文件-->修改settings.py文件-->在html中使用。

1.首先我们需要在项目根目录下的同名目录建立quanjubianliang.py文件(我是打的拼音)

from blog.models import Tag
#定义一个导航栏,让每个页面都可以使用
def dhl(request):
    tags = Tag.objects.all()
    content={'tags':tags}
    return content

2.修改settings.py中的全局变量templates

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'blog2019.quanjubianliang.dhl', #这是我们加进去的
            ],
        },
    },
]

3.在模板中使用

{% for tag in tags %}
<li><a href="#">{{ tag.name }}</a></li>
{% endfor %}

重要注意:有个大坑,如果某个页面在视图渲染的时候,没有传递request,就不能使用全局变量!比如

使用render_to_response渲染到前台,因为这个方法不能传递request,因此只能是用
render。

给浏览器设置cookie:

response =render(request, 'blog/post_read.html', content)
#给浏览器加入本片文章的ID
response.set_cookie('blog_%s_readed' % post_id, 'true')
return response

点赞

0




登陆后方可评论