django入门3
五、自定义管理表单
1、列表页字段展示
只需在 admin.py 中使用admin.site.register(模型类) 注册模型类,Django就能构造一个默认的表单。但是,默认管理表单不够美观,展示的数据量不够,我们需要要自定义管理界面中表单的外观和功能。
在列表页只列出了str方法的返回值,对象的其它属性并没有列出来,查看非常不方便
Django提供了自定义管理页面的功能,比如列表页要显示那些字段
打开personal_blog/admin.py文件,自定义类,继承自admin.ModelAdmin类属性list_display表示要显示哪些属性
自定义Post模型类的管理表单
在注册自定义的list_display时,如果有同学将tags添加到list_display中会发现服务器报错了,错误是list_display中的值不能是ManyToManyField类型
django官方解释:ManyToManyField字段不受支持,因为这将需要为表中的每一行执行单独的SQL语句。如果你想这样做,给你的模型一个自定义的方法,并将该方法的名称添加到list_display。
如果我们想要在列表页展示出多对多关系的字段那么需要到模型类中添加一个方法:
写好后将tags_name方法名加到list_display中,这样就不会报错,文章的所有标签页能显示出来。
2、列表页表头修改
观察下表头,列名使用的是模型类中的字段名的大写,并且将下划线转成了空格。
如果对列名不满意可以在模型类中定义一个方法代替原来字段,方法返回原来字段的值。将TITLE修改成“标题”。修改models.py文件Post类:
然后在到admin.py文件中修改PostAdmin类中的list_dispaly元素'title'修改成刚才在models中创建的方法名
3、编辑页面排版修改
细心的同学应该注意到了,在增加修改页面的排版问题,django默认是按照模型类编写的循序从上到下展示字段的。但是我们编写模型类字段很多时候并不会去关心字段的顺序。所以在后台编辑的时候不能将相近的字段在一起编辑,给后台编辑带来不便。django在注册模型类的时候提供了fieldsets 属性来控制编辑页面的排版。
修改admin.py文件,PostAdmin类:
fields 属性控制编辑页面展示内容
增加修改页只展示fields属性包含的内容。如果有些字段是默认不需要修改的可以是用fields控制。
显然只用fields并不能提供给我们一个直观的排序方式。要创造一个直观的排序方式就需要fieldsets配合fields使用。
修改admin.py文件中的PostAdmin类:
fieldsets中每个元组的第一个元素是字段集的标题,第二个元素是一个字典fields属性。 设置fieldsets属性后,后台编辑页面字段分类显示!这样对网站编辑比较友好。
隐藏字段集,在字段很多的情况下,编辑页会很长,如果将部分字段集隐藏起来,需要修改的时候再显示,这样编辑起来就方便很多 修改admin.py文件的PostAdmin类:字段集中添加 'classes': ['collapse']
字段集中添加了'classes': ['collapse']属性的字段集默认将被隐藏起来,需要点显示才能显示出来编辑。
4、添加关联对象
Category跟Post是一对多的关系,编辑Post每个与其它对象拥有ForeignKey关系的对象都有一个这种链接。当你点击“+”,你将看到一个带有“添加 category”表单的弹出窗口。如果你在这个窗口中添加了一个category并点
击“Save”,Django会将保存这个category到数据库中,然后动态地将这个对象添加为你正编辑的category的选择项。
django认为这是一个很麻烦的事情,高效的编辑方式应该在创建category对象的时候顺便一起编辑Post。
inlines 指定关联的模型类 extra 指定提供几个空白空间,不能被删除。
这告诉Django:Post对象在Category的管理界面中编辑。默认提供足够3个Post的空间。
这里有一个问题,关联表放进来后占用大量的屏幕空间,为了解决这个问题,Django提供了一种以表格的形式显示内嵌的相关联对象的方法,只需改变一下 PostInline 的声明:
使用 TabularInline(不是StackedInline),这些相关联的对象显示成紧凑的、基于表格的形式:
声明为 TabularInline 后这里内嵌的Post就以表格的形式展示
5、添加搜索功能
在admin.py中注册模型类中添加search_fields属性,可以是列表,也可以是元祖。里面的元素是支持搜索的字段名称。
增加标题,分类搜索:在admin.py中PostAdmin类中增加search_fields属性,将需要搜索的字段添加到列表中。
添加好search_fileds属性后,刷新列表页,会出现搜索框。这样就支持 title,category 值的搜索。
注意:如果搜索字段里有外键。要注明外键的那个字段,双下划线。否则就会报下面错误。
6、过滤器
再次编辑你的admin.py文件来改进列表页面:使用list_filter来添加过滤器。将下面这行添加进PostAdmin:
这行代码添加一个“Filter”侧边栏,管理员可以通过title,category字段对列表内容进行显示过滤:
7、修改表名
在后台管理页面中表名默认使用模型类名称的复数形式。通常情况下,我们都会将表名修改成比较直观的名称。
修改表名使用模型类的一个内置类Meta类。Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。
Meta选项:
db_table
ordering
verbose_name
verbose_name_plural
修改modles.py文件模型类,每个模型类创建一个内置Meta类修改模型类名称
8、分页显示
django后台管理页面默认一页显示100条数据,在注册模型类时可以指定一页显示几条数据
修改admin.py文件PostAdmin类:添加list_per_page属性,属性值为一个数字,指定一页显示几条数据
9、修改应用的名称
Dajngo在Admin后台默认显示的应用的名称为创建app时的名称。
我们如何修改这个app的名称达到定制的要求呢,其实Django已经在文档里进行了说明。
从Django1.7以后不再使用app_label,修改app相关需要使用AppConfig。我们只需要在应用的 init .py里面进行修改:
六、视图和URL
后台管理页面已经做的差不多了,那下面应该就是做 公共 站点,也就是给别人看的网页部分。
对于django的设计框架MVT,用户在URL中请求的是视图,视图接收请求后进行处理,并将处理的结果返回给请求者
1、原理
视图(view)是Django应用中的一“类”网页,它通常使用一个特定的函数提供服务,并且具有一个特定的模板。例如,在博客应用中,可能有以下视图:
博客首页 —— 显示最新发表的博客。
博客“详细”页面 —— 单篇博客的固定链接页面。评论 —— 对给定的博客发表评论
在Django中,网页的页面和其他内容都是由视图来传递的(视图对WEB请求进行回应)。每个视图都是由一个简单的Python函数(或者是基于类的视图的方法)表示的。Django通过检查请求的URL(准确地说,是URL里域名之后的那部分)来选择使用哪个视图。
比如访问知乎:https://zhuanlan.zhihu.com/p/32292103 你会发现域名之后会带有类似 /p/32292103 django就是利用url域名之后的这段路径去匹配视图。
Django使用叫做‘URLconf’的配置来为URL匹配视图。 一个URLconf负责使用正则表达式将URL模式匹配到视图。
2、定义视图
视图就是一个Python函数(或者是基于类的视图的方法),被定义在views.py中视图的第一个参数是HttpRequest类型的对象request,包含了所有请求的信息视图必须返回HttpResponse对象,包含返回给请求者的响应信息
让我们来编写第一个视图。 打开应用目录下的views.py文件并将以下Python代码写入:
personal_blog/views.py
这是Django中最简单的视图。 为了能够调用这个视图,我们需要将这个视图映射到URL上 —— 利用一个
URLconf。
3、URL配置
项目目录下的settings.py中通过ROOT_URLCONF指定url配置,创建项目的时候会默认指定。
默认配置
urlpatterns列表,存储url()对象,这个名称是固定的 urlpatterns中的每个正则表达式在第一次访问它们时被编译
url()对象,被定义在django.conf.urls包中
语法: 1、包含,一般在自定义应用中创建一个urls.py来定义url
2、定义,指定正则和视图的对应关系
正则说明:
定义一个视图:
配置url
URLconf配置规则:
一条URLconf包括url规则、视图两部分
url规则使用正则表达式定义
视图就是在views.py中定义的视图
查找视图的过程:在浏览器地址栏中输入url,请求到网站后,获取url信息,然后与编写好的URLconf从上往下逐条匹配,如果匹配成功则调用对应的视图,退出匹配。如果所有的URLconf都没有匹配成功,则返回404错误,
配置url有两种方式,第一种是在项目目录的URLconf配置文件中配置,如下:
blog/urls.py中配置:
不推荐使用这种方法,如果一个项目有多个应用,全部url都配置到项目URLconf中,会很混乱,不好维护。
启动服务器,在浏览器中输入http://http:127.0.0.1:8000/index/ ,可以访问到index这个视图了。浏览器接收到 hello world 这个返回值。
第二种方法在应用目录中创建一个URLconf,创建一个名为urls.py的文件,创建好后项目文件如下图:
创建好文件之后,需要让项目的URLconf链接到应用的URLconf中。修改项目urls.py:
配置好关联之后,回到应用中的URLconf配置中。
personal_blog/urls.py
配置好后在浏览器输入:http://127.0.0.1:8000/blog/index/ ,同样可以访问到视图函数,以后都使用第二种方法。
4、匹配规则介绍
上面有提到,参与匹配的url只是域名之后。比如:http://127.0.0.1:8000/blog/index/?a=1&b=5 这个url 只会有
blog/index/ 参与匹配,域名以及参数都不参与匹配。
匹配从项目URLconf中开始匹配,项目中的URLconf是那个文件,可以在setting.py的设置文件看到这条配置。
URLconf根配置是blog/urls.py这个文件。
blog/urls.py文件:
blog/index/ 从上到下开始匹配,被 r'^blog/' 这条正则匹配中 ,这条正则是对应包含personal_blog应用中的
urls.py的,那么将继续到personal_blog/urls.py中继续匹配 在前面匹配过的内容将不再参与匹配,那么只剩下
index/ 会继续匹配。
personal_blog/urls.py
继续匹配, index/ 匹配中 r'^index/$' 规则,这条URLconf对应视图,那么将会执行这个视图。 到这里整个匹配过程结束。如果全部正则都没有匹配上,就会报 404 错误请求资源不存在。
5、url中参数提取
django中,可以将url提取值作为参数传给视图。视图函数可以接收
位置参数:
定义一个/year/month/day/ 格式的url,需要将year,month,day提取出来传给视图函数由于日期都是数字格式那么这些编写正则:
视图函数接收参数: 正则第一个分组参数将传给视图的第二个形参,第二个传给视图第三个形参,以此类推。
浏览器访问 http://127.0.0.1:8000/blog/2014/2/12/ ,效果如下
关键参数:
在正则表达式部分为组命名 修改url中的正则表达式。 其中?P部分表示为这个参数定义的名称。
视图函数中的形参,只能用正则中分组的名称。不管关键字参数位置如何传,最终结果是一样的。
6、URL起别名
一般网页中都有很多链接,其实这些链接就是一个url地址。比如在网页里面使用<a href="/index">首页</a>.像这样的链接有很多。假如有一天,突然需要改变登录的链接,想将/index 变成/blog/index 这样的话,就需要将url里面的正则改变成^blog/index/$,同时再将<a>标签里面的href变成^blog/index/$。像这样<a>的链接太多了,根本就无法修改。
由于没有学到模板,后面会详细介绍模板,这里知道name作用即可:
这个应用中新建一个 templates 文件夹,在templates中新建一个 index.html index.html
创建一个视图,返回index.html
应用中url配置
在浏览器中访问:http://127.0.0.1:8000/blog/index/
现在需求改了,原来的a标签连接需要修改成 /blog/detail/p/ 那么修改正则后,a标签是不是得全部修改!这样工作量就很大了,如果一个网站很多url,那么该的时候有部分没改过来,那不就出问题了。 那么我们用name参数来改进下:
url增加一个name参数
修改模板:
修改完后重新访问:http://127.0.0.1:8000/blog/index/ 查看网页源代码:
这种写法,修改url之后,我们看看能不能正常渲染。 修改url:
使用name参数,在不修改前端页面url的情况下,修改了url,django会在前端页面自动渲染name参数对应的
url。其他没有使用name参数的a标签url就没有修改过来。
name参数还有其他用法这里先不细讲,由于刚入门django知识储备还不够,再深入讲解可能大家听不懂,所以先将基础知识学完之后会补充name参数其他用法。
7、视图与模型交互
每个视图函数只负责处理两件事中的一件:返回一个包含所请求页面内容的 HttpResponse对象,或抛出一个诸如
Http404异常。 视图可以从数据库中读取记录,或者不读取数据库。下面访问数据库,读取文章标题返回。
修改 index视图
访问 http://127.0.0.1:8000/blog/index/

浙公网安备 33010602011771号