django相对于flask这种轻框架来说被称为全栈框架,因为它提供了相当多集成好的功能,比如前面讲了模板,其实Django提供了一些通用模板,它们可以让开发人员编写少量代码就能快速实现常见的数据视图。

有了通用视图,可以把模型作为额外的参数传给 URL 配置。Django 自带的通用视图能实现下述功能:

• 列出对象并显示单个对象的详细信息。如果创建一个管理学生的应用程序,那么 studentListView 就是学生列表视图。

• 呈现基于日期的对象,显示为年月日归档页面(带有详细信息),以及“最新”页面。

• 让用户创建、更新和删除对象——需不需要授权都行。

这些视图提供了简单易用的接口,在视图中显示数据库里的数据时能为开发者执行多数常见的任务。

下面介绍Django中常见的几种通用视图。

1、ListView

ListView用于展示列表。比如我们现在想用一个页面展示所有学生的列表,我们在原来的views.py里面加入如下代码:

from django.views.generic import ListViewclass StudentList(ListView):template_name = 'student_list.html'model = Student

然后新建一个student_list.html文件:

{% extends "base.html" %}
{% block main %}
<h2>学生名单</h2>
<ul>
{% for s in student_list %}
<li class="btn">{{ s.name }}, 性别{{s.sex}},年龄{{s.age}},成绩{{s.score}}</li>
{% endfor %}
</ul>
{% endblock %}

在url.py文件里设置路由,让视图和模板关联起来

urlpatterns = [......path('students/',StudentList.as_view()),
]

然后访问 http://127.0.0.1:8000/students,看到

2、DetailView

DetailView用于展示单个模型对象的数据。通常情况下,在URL中向视图提交对象的id,视图使用id获得模型对象,并将模型对象传递给模板。

我们还是先来扩展DetailView类

class StudentDetail(DetailView):template_name = 'student_detail.html'model = Student

然后新建一个student_detail.html

{% extends "base.html" %}
{% block main %}
<h2>姓名:{{ object.name }}</h2>
<p>年龄:{{ object.age }}</p>
<p>性别:{{ object.sex }}</p>
<p>成绩:{{ object.score }}</p>
{% endblock %}

这里要注意,默认的 object名称是object,如果要自定义名称可以改为:

......
#指定object名称
template_object_name = 'student'
......

最后再设置路由:

urlpatterns = [......path('student/<int:pk>/',StudentDetail.as_view()),
]

注意这里的<int:pk>  int表示接受的参数为整数,pk表示数据为模型的主键

然后访问 http://127.0.0.1:8000/student/5/,看到

如果我们想要增加一些模型里没有的数据,可以通过改写 get_context_data 方法来实现,比如说我现在想要给每位同学加一个称呼,那么我们把这个类改写一下

class StudentDetail(DetailView):#指定数据集(过滤数据)#queryset = Student.objects.filter(sex='male')#指定模板路径template_name = 'student_detail.html'#指定object名称template_object_name = 'student'model = Studentdef get_context_data(self, **kwargs):context = super(StudentDetail,self).get_context_data(**kwargs)#获取当前的对象,就是加上了pk参数之后获得的Student对象实例student = kwargs.get('object',None)#取名字第一个字为姓(仅作示例,没考虑复姓情况)context['chenghu']= student.name[:1] + '大侠'return context

student_detail.html里面加一行

{% extends "base.html" %}
{% block main %}
<h2>姓名:{{ student.name }}</h2>
<p>年龄:{{ student.age }}</p>
<p>性别:{{ student.sex }}</p>
<p>成绩:{{ student.score }}</p>
<p>称呼:{{ chenghu }}</p>
{% endblock %}

然后我们再访问一下  http://127.0.0.1:8000/student/5/,看到

3、ArchiveIndexView

django.views.generic.dates 模块中基于日期的通用视图用于显示基于日期的层次数据。

其中 ArchiveIndexView 顶层索引页面,显示最新的对象(按日期排序)。

如果未把 allow_future 设为 True,未来日期对应的对象不包含在内。

我们还是做一个案例,把上面的那些同学按照年龄排列

首先,修改models.py 中Student模型,增加一个bornDate字段,用来存放同学们的出生日期

class Student(models.Model):id = models.IntegerField(primary_key=True)name = models.CharField(max_length=20,verbose_name='姓名')age = models.IntegerField(blank=True)sex = models.CharField(max_length=10)score = models.IntegerField (blank=True,default=0)bornDate = models.DateField(default='1996-01-22')

然后在urls.py 文件中增加一个路由archive

from django.contrib import admin
from django.urls import path
from newweb.views import *
from classManage.views import *urlpatterns = [path('',classnotice),path('outdata',outdata),path('admin/', admin.site.urls),path('hello/',hello),path('student/<int:pk>/',StudentDetail.as_view()),path('notice',classnotice),path('add/',addstudent),path('find/',findstudent),path('findall/',findall),path('findtj/<str:tj>/<str:zhi>',find_tj),path('modify/',modifystudent),path('del/',delstudent),path('displayMate/',display_meta),path('search/',chaxun3),path('cha/',chaxun4),path('sex_count/',sexCount),path('age_adult/',ageAult),path('yuanshi/',yuanshi),path('students/',StudentList.as_view()),path('archive/',ArchiveIndexView.as_view(model=Student, date_field="bornDate"),name="student_archive"),]#这里的模型就用我们之间创建的Student,date_field是指定的用来排序的日期字段

最后再展示一下

{% extends "base.html" %}
{% block main %}<ul>
{% for student in latest %}
<li>{{ student.name }} : {{ student.bornDate }} </li>
{% endfor %}
</ul>{% endblock %}

然后访问 http://127.0.0.1:8000/archive/,看到 学生信息按照出生日期排序了

另外还有 YearArchiveView  MonthArchiveView  WeekArchiveView DayArchiveView  TodayArchiveView  DateDetailView 等等用法也类似,就不展开了。

4、FormView

FormView是用来构建表单的通用视图,还记得我们在第八章((1条消息) <学习笔记>从零开始自学Python-之-web应用框架Django( 八)Django表单_阿尔法羊的博客-CSDN博客)里面做的那个查询表单嘛,我们现在用FormView来实现它。

我们先找到form.py,改造一下,主要是增加一个查询用的函数 get_result

from django import forms
from classManage.models import Student
from django.shortcuts import renderclass chaxunForm(forms.Form):name = forms.CharField(label="名字",max_length=10,required=False)age = forms.IntegerField(label="年龄",required=False,max_value=100,min_value=10)score = forms.IntegerField(label="成绩",required=False)def get_result(self):results=[]context={}stuName = self.cleaned_data.get('name')stuAge = self.cleaned_data.get('age')stuScore = self.cleaned_data.get('score')if stuName:stus=Student.objects.filter(name=stuName)elif stuAge:stus=Student.objects.filter(age=stuAge)elif stuScore:stus=Student.objects.filter(score=stuScore)else:passfor s in stus:result = '符合您查询条件的信息如下:姓名:{},年龄{},性别{},成绩{}'.format(s.name,s.age,s.sex,s.score)results.append(result)context['results']=resultsprint(context)return context

然后我们在 views.py 文件中创建一个类,继承FormView

class chaXunView(FormView):initial = {'name':'郭靖','age':18}          #初始值,可以在页面加载后看到template_name = 'chaxun.html'               #指定模板form_class = chaxunForm                     #指定表单类success_url = '/chaxun/'                    #成功后跳转路径#extra_context={'title':'查询结果'}         #额外的context内容

FormView有很多内置方法,我们这里只要改写一下其中的 form_valid方法,用于获取我们查询到的结果,即判断form有效之后调用 form 的 get_result方法获取数据

class chaXunView(FormView):initial = {'name':'姓名','age':18}template_name = 'chaxun.html'form_class = chaxunFormsuccess_url = '/chaxun/'#extra_context={'title':'查询结果'}def form_valid(self, form):context=form.get_result()context['title']='查询结果'return self.render_to_response(context=context)

然后在urls.py中加上一条路径

。。。。。。
path('chaxun/',chaXunView.as_view(),name="student_chaxun"),
。。。。。。

最后改造一下显示页面 chaxun.html,如果有查询结果就显示结果,否则显示表单

{% extends "base.html" %}
{% block title %}武侠三班的小窝{% endblock %}{% block main %}
<h1>查询页面,在这里可以查找你想了解的同学</h1>{% if title %}
<h4>{{title}}</h4>
<P>{% for result in results %}
<div>{{result}}</div>{% endfor %}
</P>
{% else %}
<form action="" method="post">{% csrf_token %}<h3>根据条件查找同学</h3>{{form}}<input type="submit" value="查询">
</form>
{% endif %}{% endblock %}

好了,我们访问下 http://127.0.0.1:8000/chaxun/

可以看到默认值 ‘郭靖’ 和 18 已经显示在表单中,我们输入条件查询一下年龄为20的同学

5、模型表单ModelForm

处理模型时使用通用视图非常方便。只要能确定模型类,通用视图就能自动创建一个 ModelForm。

确定模型类的方法如下:

• 使用 model 属性指定的模型类。

• 使用 get_object() 返回的对象所属的类。

• 使用 queryset 对应的模型。

模型表单视图提供的 form_valid() 能自动保存模型。如果有其他需求,可以覆盖这个方法。

例如:我们设计一个页面用于录入学生信息,我们在views.py里面新建一个addStudent类

class addStudent(ModelForm):class Meta:model = Student         #对应的Model中的类fields = "__all__"      #字段,如果是__all__,就是表示列出所有的字段exclude = None          #排除的字段labels = None           #提示信息help_texts = None       #帮助提示信息widgets = None          #自定义插件error_messages = None   #自定义错误信息#error_messages用法:error_messages = {'name':{'required':"用户名不能为空",},'age':{'required':"年龄不能为空",},}#labels,自定义在前端显示的名字labels= {"name":"用户名","age":"年龄","sex":"性别","score":"得分","bornDate":"生日",}

然后定义一个add_student 视图函数,get方法用来获取页面,post方法用来获取前端传来的信息,然后用save()方法保存信息。

def add_student(request):if request.method == 'GET':student_list = addStudent()return render(request,'addStudent.html',{'students':student_list},status=200)else:student_list = addStudent(request.POST)if student_list.is_valid():student_list.save()return render(request,'addStudent.html',{'student_list':student_list},status=200)

然后还是在urls.py 里加上路径

。。。。。。
path('add_student',add_student),
。。。。。。

最后新建一个addStudent.html页面用于前端交互

{% extends "base.html" %}
{% block main %}<h2>添加学生</h2><div class="container" ><form method="POST" novalidate>{% csrf_token %}
{#            {{ students.as_p }}#}{% for student in students %}<div class="form-group col-md-6">{# 拿到数据字段的verbose_name,没有就默认显示字段名 #}<label class="col-md-3 control-label">{{ student.label }}</label><div class="col-md-9" style="position: relative;">{{ student }}</div></div>{% endfor %}<div class="col-md-2 col-md-offset-10"><input type="submit" value="提交" class="btn-primary"></div></form>
</div>{% endblock %}

好,我们访问一下 http://127.0.0.1:8000/add_student

一个录入信息的表格就做好了,我们填入数据,然后点击提交

再访问查询数据

CreateView, UpdateView, DeleteView 等用法类似,可以方便地实现创建、刷新、删除等功能

<学习笔记>从零开始自学Python-之-web应用框架Django( 十)通用模板相关推荐

  1. python创建虚拟环境_Python学习笔记:创建Python开发Web程序的虚拟环境

    学习Excel技术,关注微信公众号: excelperfect 这段时间利用业余时间在断断续续地看Eric Matthes著的<Python编程从入门到实践>这本书,毫不夸张地说,这真的是 ...

  2. 超级详细的Python程序设计学习笔记,适合Python二级备考和自学Python的小白(me too)

    超级详细的Python学习笔记,适合Python二级备考和自学Python的小白(me too). 写作不易,喜欢的话点个赞吧

  3. 自学python方法-从零开始自学python编程,你找对方法了吗?

    原标题:从零开始自学python编程,你找对方法了吗? 适合初学者入门 其实python非常适合初学者入门.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易.自带的各种模块加上丰富的第三方 ...

  4. (Python入门)学习笔记二,Python学习路线图

    (Python入门)学习笔记二,Python学习路线图 千里之行始于足下,谋定而后动,冰冻三尺非一日之寒.之所以说这三句话,就是对于下面整理的路线图,即不让自己感觉路途的遥远而感到达到巅峰神界的遥遥无 ...

  5. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  6. Python学习笔记:使用Python操作数据库

    Python学习笔记:使用Python操作数据库 一.数据库编程接口 为了对数据库进行统一的操作,大多数语言都提供了简单的.标准化的数据库接口(API).在Python Database API 2. ...

  7. 数据结构学习笔记:利用Python列表实现栈结构

    数据结构学习笔记:利用Python列表实现栈结构 利用Python列表实现栈结构.有两种实现方式: 1.将列表的末尾(rear)作为栈顶(top) 2.将列表的前端(front)作为栈顶(top) 一 ...

  8. Python学习笔记:用Python获取数据(本地数据与网络数据)

    Python学习笔记:用Python获取数据(本地数据与网络数据) 一.用Python获取本地数据 读写文件(三种基本模式:r, w, a) 1.写文件 2.读文件

  9. python学习笔记26(python中__name__的使用)

    python学习笔记26(python中__name__的使用) 在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以imp ...

  10. AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型

    AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型 波士顿房价预测任务 线性回归模型 线性回归模型的神经网络结构 构建波士顿房价预测任务的神经网络模 ...

最新文章

  1. 学生教育云平台登录入口_湖南省教育云平台登录入口
  2. overload和override的区别
  3. JS:2.1,流程控制(if,switch)高级
  4. 图的两种存储形式(邻接矩阵、邻接表)
  5. NLP中数据增强的综述,快速的生成大量的训练数据
  6. Python学习之快速入门
  7. IntersectionObserver对象
  8. AD20元件重叠绿色报错的解决方法,距离太近绿色报错
  9. Spring Cloud各组件
  10. Ubuntu18.04之搜狗输入法
  11. 昆仑通态复制的程序可以用吗_昆仑通态MCGS_G系列触摸屏MQTT数据连接发布
  12. 使用postman测试post类型请求
  13. Python:实现random forest regressor随机森林回归器算法(附完整源码)
  14. electron操作注册表时,regedit模块功能缺少deleteValue功能的解决办法
  15. starbound服务器未响应,星界边境starbound
  16. uniapp使用IPA苹果支付
  17. 如何验证Mac的Time Machine备份是否正常工作
  18. 素问—渗透测试的简介
  19. 彻底解决Chrome自动更新方案
  20. 《JavaWeb视频教程》(p34)

热门文章

  1. Python正则表达式及re模块使用
  2. python画频率直方图_【python常用图件绘制#02】频率、累计频率双纵坐标轴图
  3. android转场动画效果,Android转场动画
  4. Android电池健康,Android电池的健康状况如何确定?
  5. Words Seven
  6. Windows 去除快捷方式小箭头真正无任何副作用的方法!
  7. MTK 虚拟键盘与输入法
  8. 获取linux详细信息,通过编程获取Linux文件系统使用的详细信息
  9. 苹果病毒如何攻击中国用户?
  10. html+css完成腾讯页面