在如何自定義之前 我們先來看一下正常的前后端交互方式
- 從seesions獲取數(shù)據(jù)焰情,用render方法渐夸,傳遞數(shù)據(jù)到模板中
# 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)
- 模板接收數(shù)據(jù)并判斷處理數(shù)據(jù)撕彤,然后顯示到前端
<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>
這樣的方法我們不難發(fā)現(xiàn)贤姆,用戶的session幾乎涉及網(wǎng)站的各個views榆苞,難道每個視圖函數(shù)下都要加上對于session的獲取、傳遞嗎霞捡。這顯然是不優(yōu)雅的坐漏。
自定義
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)上下文處理器的格式:
一個函數(shù),接收request參數(shù)
返回一個字典(可為空)
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', ], }, }, ]