Django中的视图

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

'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值