在如何自定义之前 我们先来看一下正常的前后端交互方式
- 从seesions获取数据,用render方法,传递数据到模板中
# views.py
def index(request):
user_id = request.session.get('user_id')
context = {}
if user_id:
try:
user = User.objects.get(pk=user_id)
except:
pass
context['login_user_name']= user.username
return render(request, 'index.html', context=context)
- 模板接收数据并判断处理数据,然后显示到前端
<ul class="nav navbar-nav navbar-right">
{% if login_user_name %}
<li><a href="#">{{ login_user_name }}</a></li>
{% else %}
<li><a href="{% url 'signin' %}">登录</a></li>
<li><a href="{% url 'signup' %}">注册</a></li>
{% endif %}
</ul>
这样的方法我们不难发现,用户的session几乎涉及网站的各个views,难道每个视图函数下都要加上对于session的获取、传递吗。这显然是不优雅的。
自定义
Django为我们提供了自定义上下文处理器的接口
- settings中的TEMPLATES下的OPTIONS['context_processors']是Django为我们提供的接口
# settings.py
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',
],
},
},
]
-
编写自己的上下文处理器
1)在app下定义context_processors.py文件
# context_processors.py from app01.models import User def CheckUser(request): user_id = request.session.get('user_id') context = {} if user_id: try: user = User.objects.get(pk=user_id) except: pass context['login_user_name']= user.username return context
2)上下文处理器的格式:
一个函数,接收request参数
返回一个字典(可为空)
3)settings中注册该文件
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', 'app01.context_processors.CheckUser', ], }, }, ]