1.函数视图
# 原本的函数视图
def login(request):
if request.method == 'POST':
pass
elif request.method == 'GET':
pass
2.类视图,继承View父类
urls.py配置文件
from demo.views import 类名
urlpatterns = [
url(r'^test/',类名.as_view()),]
views.py视图文件
from django.shortcuts import render
from django.http import HttpResponse
from django.views import View
# 类视图,继承View类
class SomeView(View):
name = 'Gavin'
# get方法
def get(self,request):
return HttpResponse("Hello {name}".format(name=self.name))
#post方法
def post(self,request):
return HttpResponse(request.method)
# 这两个方法,可以重复调用
3.通用类视图
from django.views.generic import ListView, TemplateView, DeleteView
from django.views.generic.base import TemplateResponseMixin
from django.views.generic.edit import CreateView
#继承的是具体的类,已经封装好的,功能上会有局限性;
class CourseListView(ListView):
"""通用视图"""
model = Course #等同于 Course.objects.all()
context_object_name = 'courses'
template_name = "course/course_list.html"
4.根据需求:
只是登录传模板等简单功能,可以直接使用django封装好的通用视图,要是需要自己添加一些特定功能,建议用类视图
最常用的基于类的通用视图:TemplateView,ListView,DetailView,DeleteView
TemplateView 一般只在需要返回模板时使用。
ListView 用于获取存储在数据库中的某个 Model 的列表。默认所有
DetailView 则是获取每个数据的详细信息。
【ListView】
可以使用context_object_name 来自定义上下文变量(用来传给模板);
使用model 属性指定了要获取表中的所有数据,其功能类似于article_list = Article.objects.all()
但是当你需要使用过滤条件或者对数据进行一定的操作时,则需要重写 ListView 中获取数据的方法(get_queryset 方法)
例如:
def get_queryset(self):
"""
重写 get_queryset 方法,取出包含Python关键字的课程
"""
courses = courses.filter(
Q(title__icontains='Python') |
Q(description__icontains='Python')
)
return courses
如果传给模板额外的数据,可以使用get_context_data。
更多内容,请参考官方文档:https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-display/
'''
from django.db.models import Q
# 课程列表首页
# 类视图有一个封装,直接写方法即可,不用做get,post判断
class MyCourseListView(View):
def get(self, request):
# 默认获取所有course
courses = Course.objects.all()
# 搜索功能
search_keywords = request.GET.get('kw', '')
if search_keywords:
courses = courses.filter(
# 多条件查询Q
Q(title__icontains=search_keywords) |
Q(description__icontains=search_keywords)
)
return render(request, template_name="course/course_list.html",
context={
'courses': courses
})
'''
查询条件回顾
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存...内
__contains 包含
__icontains 包含,忽略大小写
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
exclude 与 filter相反
更多内容见:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#filter
'''