request对象属性
通过request.path 方式对当前访问的页面进行标记
<li {% if request.path == '/' %}class="active"{% endif %}><a href="{% url 'index' %}">首页</a></li>
<li {% if request.path|slice:'7' == '/course' %}class="active"{% endif %}>
<a href="{% url 'course:course_list' %}">
公开课<img class="hot" src="{% static 'images/nav_hot.png' %}">
</a>
</li>
<li {% if request.path|slice:'12' == '/org/teacher' %}class="active"{% endif %}>
<a href="{% url 'org:teacher_list' %}">授课教师</a>
</li >
<li {% if request.path|slice:'9' == '/org/list' %}class="active"{% endif %}> #访问网页,url前面9个字符为'/org/list',该授课机构就会被标记(绿色)
<a href="{% url 'org:org_list' %}">授课机构</a>
</li>
request.path 可以获取当前访问页面的相对url比如“http//:127.0.0.1:8000/org/list/”,则request.path 就是“/org/list/”<l{% if request.path|slice:'9' == '/org/list' %}class="active"{% endif %}> #访问网页,url前面9个字符为'/org/list',该授课机构就会被标记(绿色).slice为模板语言切分的过滤器,/也是一个字符利用这种模板语言设置可以达到全局的“active”效果,而不用每个子页面都要去设置“active”了
request对象的属性
request.scheme :代表请求的方案,http或者https
request.path :请求的路径,比如请求127.0.0.1/org/list,那这个值就是/org/list
request.method :表示请求使用的http方法,GET或者POST请求
request.encoding :表示提交数据的编码方式
request.GET :获取GET请求
request.POST :获取post的请求,比如前端提交的用户密码,可以通过request.POST.get()来获取另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中
request.COOKIES :包含所有的cookie
request.META:一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
- CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
- CONTENT_TYPE —— 请求的正文的MIME 类型。
- HTTP_ACCEPT —— 响应可接收的Content-Type。
- HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
- HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
- HTTP_HOST —— 客服端发送的HTTP Host 头部。
- HTTP_REFERER —— Referring 页面。
- HTTP_USER_AGENT —— 客户端的user-agent 字符串。
- QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
- REMOTE_ADDR —— 客户端的IP 地址。
- REMOTE_HOST —— 客户端的主机名。
- REMOTE_USER —— 服务器认证后的用户。
- REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
- SERVER_NAME —— 服务器的主机名。
- SERVER_PORT —— 服务器的端口(是一个字符串)
request.user:一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们把request传给前端的时候,前端可以通过 {% if request.user.is_authenticated %}判断用户时候登录request.session一个既可读又可写的类似于字典的对象,表示当前的会话
配置全局搜索功能:
搜索框
<div class="wp">
<a href="index.html"><img class="fl" src="{% static 'images/logo.jpg' %}"/></a>
<div class="searchbox fr">
<div class="selectContainer fl">
<span class="selectOption" id="jsSelectOption" data-value="course">
公开课
</span>
<ul class="selectMenu" id="jsSelectMenu">
<li data-value="course">公开课</li>
<li data-value="org">课程机构</li>
<li data-value="teacher">授课老师</li>
</ul>
</div>
<input id="search_keywords" class="fl" type="text" value="" placeholder="请输入搜索内容"/>
<img class="search_btn fr" id="jsSearchBtn" src="{% static 'images/search_btn.png' %}"/>
</div>
</div>
这里以搜索课程为例子:
#course/views.py
class CourseListView(View):
'''课程列表'''
def get(self, request):
all_courses = Course.objects.all().order_by('-add_time')
# 搜索功能
search_keywords = request.GET.get('keywords', '') #获取前端传回的keywords值
if search_keywords:
# 在name字段进行操作,做like语句的操作。icontains不区分大小写,contains区分大小写
# or操作使用Q
all_courses = all_courses.filter(Q(name__icontains=search_keywords) | Q(desc__icontains=search_keywords) | Q(detail__icontains=search_keywords))
#name值包含该关键字或desc值包含该关键字或detail值包含该关键字
return render(request, "course-list.html", {
"all_courses":courses,
})
前端ajax代码:
//顶部搜索栏搜索方法
function search_click(){
var type = $('#jsSelectOption').attr('data-value'), #获取搜索类型
keywords = $('#search_keywords').val(), #获取搜索框内输入的值,搜索关键字
request_url = '';
if(keywords == ""){ #关键字不写,则不变化
return
}
if(type == "course"){ #搜索类型为课程时,url为 /course/list?keywords="+keywords
request_url = "/course/list?keywords="+keywords
}else if(type == "teacher"){ ##同上类似
request_url = "/org/teacher/list?keywords="+keywords
}else if(type == "org"){ #同上类似
request_url = "/org/list?keywords="+keywords
}
window.location.href = request_url #跳转到该url
}
eg: 执行 http//:127.0.0.1:8000/org/list?keywords=java 会以get方式请求,会向后端发送url中的数据 keywords=java数据(字符串形式) 后端获取: res=request.GET.get('keywords','') res --->> 'java'
生产环境:配置404页面,500页面
setting.py中设置
- 生产环境下,DEBUG = False,静态文件由服务器配置,django不会处理
- DEBUG = False
- ALLOWED_HOSTS = ['*'] #允许所有端口访问
#url.py
# 全局404页面配置
handler404 = 'users.views.pag_not_found'
# 全局500页面配置
handler500 = 'users.views.page_error'
视图配置
from django.shortcuts import render_to_response
def pag_not_found(request):
# 全局404处理函数
response = render_to_response('404.html', {}) #返回前端404页面
response.status_code = 404 #配置返回页面的状态码
return response
def page_error(request):
# 全局500处理函数
from django.shortcuts import render_to_response
response = render_to_response('500.html', {})
response.status_code = 500
return response