Diango 第五章 探究CBV视图
Django植入视图功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发,这种以类的形式实现响应与请求处理成为CBV(Class Base Views)
文章目录
1. 数据显示视图
数据显示视图是将后台的数据展示在网页上,数据主要来自模型,一共定义了4个视图类,分别是 RedirectView、TemplateView、ListView 和 DetailView,说明如下:
- RedirectView 用于实现HTTP 重定向,默认情况下只定义GET请求的处理方法。
- TemplateView 是视图类的基础视图,可将数据传递给 HTML 模板,默认情况下只定义GET
请求的处理方法。 - ListView 是在 TemplateView的基础上将数据以列表显示,通常将某个数据表的数据以列表表
示。 - DetailView 是在 TemplateView 的基础上将数据详细显示,通常获取数据表的单条数据。
1.1 重定向视图RedirectView
对视图类RedirectView进行重写
#My urls.py
urlpatterns = [
# 定义路由
path('', index, name='index'),
path('trunTo', trunTo.as_view(), name='trunTo')
]
#My views.py
def index(request):
return render(request, 'index.html')
class trunTo(RedirectView):
permanent = False
url = None
pattern_name = 'My:index'
query_string = True
def get_redirect_url(self, *args, **kwargs):
print('This is get_redirect_url')
return super().get_redirect_url(*args, **kwargs)
def get(self, request, *args, **kwargs):
print(request.META.get('HTTP_USER_AGENT'))
return super().get(request, *args, **kwargs)
#teplates index.html
<!DOCTYPE html>
<html>
<body>
<h3>Hello RedirectView</h3>
<a href="{% url 'My:trunTo' %}?k=1">ToTurn</a>
</body>
</html>
1.2 基础视图TemplateView
视图类TemplateView是所有视图类里最基础的应用视图类
#My urls.py
urlpatterns = [
# 定义路由
path('', index.as_view(), name='index'),
]
#My view.py
class index(TemplateView):
template_name = 'index.html'
template_engine = None
content_type = None
extra_context = {'title': 'This is GET'}
# 重新定义模版上下文的获取方式
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['value'] = 'I am MyDjango'
return context
# 定义HTTP的POST请求处理
def post(self, request, *args, **kwargs):
self.extra_context = {'title': 'This is POST'}
context = self.get_context_data(**kwargs)
return self.render_to_response(context)
#index.html
<!DOCTYPE html>
<html>
<body>
<h3>Hello,{{ title }}</h3>
<div>{{ value }}</div>
<br>
<form action="" method="post">
{% csrf_token %}
<input type="submit" value="Submit">
</form>
</body>
</html>
1.3列表视图ListView
将数据表以列表的形式显示,常用于数据的查询和展示。
#在My的models.py
from django.db import models
class PersonInfo(models.Model):
id = models.AutoField(primary_key = True)
name = models.CharField(max_length=20)
age = models.ImageField()
上面只搭建PersonInfo类和数据表personinfo的映射关系,但在数据库中并没有生成。数据库以SQLite3为例,在terminal中文件下,依次输入迁移指令
python manage.py makemigrations
python manage.py migrate
完成后看到
在My_personinfo中填入
在index.html中
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<body>
<h3>{{ title }}</h3>
<table border="1">
{% for i in personinfo_list %}
<tr>
<th>{{ i.name }}</th>
<th>{{ i.age }}</th>
</tr>
{% endfor %}
</table>
<br>
{% if is_paginated %}
<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="/?page={{ page_obj.previous_page_number }}">上一页</a>
{% endif %}
{% if page_obj.has_next %}
<a href="/?page={{ page_obj.next_page_number }}">下一页</a>
{% endif %}
<br>
<br>
<span class="page-current">
第{{ page_obj.number }}页,共{{ page_obj.paginator.num_pages }}页。
</span>
</span>
</div>
{% endif %}
</body>
</html>
1.4 详细试图DetailView
将数据库的某一条数据详细显示在网页上。
2 数据操作视图
数据操作视图是对模型进行操作,如增、删、改,从而实现Django与数据库的数据父。数据操作视图有4个视图类,分别是
FormView、CreateView、UpdateView 和 DeleteView,说明如下:
- FormView 视图类使用内置的表单功能,通过表单实现数据验证、响应输出等功能,用于显 示表单数据。
- CreateView 实现模型的数据新增功能,通过内置的表单功能实现数据新增。
- UpdateView 实现模型的数据修改功能,通过内置的表单功能实现数据修改。
- DeleteView 实现模型的数据删除功能,通过内置的表单功能实现数据删除。
2.1 表单视图
视图类表单是表单在视图里的一种使用方式,表单时搜集用户数据信息的各种表单元素的集合,作用是实现网页上的数据交互,用户在网站输入数据信息,然后提交到网站服务器端进行处理,如数据录入
注册等。
在APP应用下创建form.py文件
```bash
#form.py文件
from django import forms
from My.models import PersonInfo
class PersonInfoForm(forms.ModelForm):
class Meta:
model = PersonInfo
fields = '__all__'
#urls.py
urlpatterns = [
path('', index.as_view(), name='index'),
path('result',result, name = 'result')
]
#views.py
def result(request):
return HttpResponse('Success')
class index(FormView):
initial = {'name':'妹妹','age': 11}
template_name = 'index.html'
success_url = '/result'
form_class = PersonInfoForm
extra_context = {'title':'人员信息表'}
#index.html
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<body>
<h3>{{ title }}</h3>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="确定">
</form>
</body>
</html>
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200526195245934.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200526195304741.png)
## 2.2新增试图CreateView
在视图类FormView的基础上加入数据新增的功能
在上面的项目中修改views.py
```bash
def result(request):
return HttpResponse('Success')
class index(CreateView):
initial = {'name':'妹妹','age': 11}
template_name = 'index.html'
success_url = '/result'
form_class = PersonInfoForm
model = PersonInfo
fileds = ['name','age']
extra_context = {'title':'人员信息表'}
2.3 修改视图UpdateView
#urls.py
urlpatterns = [
path('<age>.html', index.as_view(), name='index'),
path('result',result, name = 'result')
]
#views.py
def result(request):
return HttpResponse('Success')
class index(UpdateView):
initial = {'name':'妹妹','age': 11}
template_name = 'index.html'
success_url = '/result'
form_class = PersonInfoForm
model = PersonInfo
fileds = ['name','age']
slug_url_kwarg = 'age'
slug_field = 'age'
context_object_name = 'personinfo'
extra_context = {'title':'人员信息表'}
#index.html
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<body>
<h3>{{ title }}-{{ personinfo.name }}</h3>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="确定">
</form>
</body>
</html>
访问127.0.0.1:8000/11.html
2.4删除视图DeleteView
#urls.py
urlpatterns = [
path('<pk>.html', index.as_view(), name='index'),
path('result',result, name = 'result')
]
#views.py
def result(request):
return HttpResponse('Success')
class index(DeleteView):
template_name = 'index.html'
success_url = '/result'
model = PersonInfo
context_object_name = 'personinfo'
extra_context = {'title':'人员信息表'}
#index.html
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<body>
<h3>{{ title }}-{{ personinfo.name }}</h3>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<div>
删除{{ personinfo.name }}?
</div>
<input type="submit" value="确定">
</form>
</body>
</html>
3.日期筛选试图
日期筛选视图是根据模型里的某个日期字段进行数据筛选,然后将符合结果的数据以一定的形式显示在网页上。简单来说,就是在列表视图ListView或详细视图 DetailView 的基础上增加日期筛选所实现的视图类。它一共定义了7个日期视图类,其说明如下:
- ArchiveIndex View是将数据表所有的数据以某个日期字段的降序方式进行排序显示。
- YearArchiveView 是在数据表筛选某个日期字段某年的所有数据,并默认以升序的方式排序显 示,年份的筛选范围由路由变量提供。
- MonthArchiveView 是在数据表筛选某个日期字段某年某月的所有数据,并默认以升序的方式 排序显示,年份和月份的筛选范围都是由路由变量提供的。
- WeekArchiveView 是在数据表筛选某个日期字段某年某周的所有数据,总周数是将一年的总 天数除以7所得的,数据默认以升序的方式排序显示,年份和周数的筛选范围都是由路由变 量提供的。
- DayArchiveView 是对数据表的某个日期字段精准筛选到某年某月某天,将符合条件的数据以 升序的方式排序显示,年份、月份和天数都是由路由变量提供的。
- TodayArchiveView 是在视图类 DayArchiveView 的基础上进行封装处理,它将数据表某个日期字段的筛选条件设为当天时间,符合条件的数据以升序的方式排序显示。
- DateDetailView 用于查询某年某月某日某条数据的详细信息,它在视图类 DetailView 的基础 上增加日期筛选功能,筛选条件主要有年份、月份、天数和某个模型字段,其中某个模型字 段必须具有唯一性,才能确保查询的数据具有唯一性。
推荐阅读