Django站点管理(续1)

  上次介绍了Django的站点管理的一些基础知识,这次再来深入了解一下Django的站点管理。

  Admin是如何工作的:

  在幕后,管理工具是如何工作的呢? 其实很简单。

  当服务启动时,Django从url.py引导URLconf,然后执行“admin.autodiscover()” 语句。 这个函数遍历INSTALLED_APPS配置,并且寻找相关的 admin.py文件。 如果在指定的app目录下找到admin.py,它就执行其中的代码。

  在books 应用程序目录下的admin.py 文件中,每次调用admin.site.register() 都将那个模块注册到管理工具中。 管理工具只为那些明确注册了的模块显示一个编辑/修改的界面。

  应用程序 django.contrib.auth 包含自身的 admin.py ,所以Users和Groups能在管理工具中自动显示。 其它的django.contrib应用程序,如django.contrib.redirects,其它从网上下在的第三方Django应用程序一样,都会自行添加到管理工具。

  综上所述,管理工具其实就是一个Django应用程序,包含自己的模块、模板、视图和URLpatterns。 你要像添加自己的视图一样,把它添加到URLconf里面。 你可以在Django基本代码中的django/contrib/admin 目录下,检查它的模板、视图和URLpatterns,但你不要尝试直接修改其中的任何代码,因为里面有很多地方可以让你自定义管理工具的工作方式。 (如果你确实想浏览Django管理工具的代码,请谨记它在读取关于模块的元数据过程中做了些不简单的工作,因此最好花些时间阅读和理解那些代码。)

设置字段可选

  在摆弄了一会之后,你或许会发现管理工具有个限制:编辑表单需要你填写每一个字段,然而在有些情况下,你想要某些字段是可选的。 举个例子,我们想要Author模块中的email字段成为可选,即允许不填。 在现实世界中,你可能没有为每个作者登记邮箱地址。

  为了指定email字段为可选,你只要编辑Book模块(回想前几节,它在mysite/books/models.py文件里),在email字段上加上blank=True。代码如下: 

 class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(**blank=True** ) #**内为修改内容

  这些代码告诉Django,作者的邮箱地址允许输入一个空值。 所有字段都默认blank=False,这使得它们不允许输入空值。

  当你添加blank=True以后,刷新页面Add author edit form (http://127.0.0.1:8000/admin/books/author/add/ ),将会发现Email的标签不再是粗体了。 这意味它不是一个必填字段。 现在你可以添加一个作者而不必输入邮箱地址,即使你为这个字段提交了一个空值,也再不会得到那刺眼的红色信息“This field is required”。

  但是,其它数据类型有例外:日期型、时间型和数字型字段不接受空字符串。 如果你尝试将一个空字符串插入日期型或整数型字段,你可能会得到数据库返回的错误,这取决于那个数据库的类型。 (PostgreSQL比较严禁,会抛出一个异常;MySQL可能会也可能不会接受,这取决于你使用的版本和运气了。)在这种情况下,NULL是唯一指定空值的方法。 在Django模块中,你可以通过添加null=True来指定一个字段允许为NULL

  因此,这说起来有点复杂: 如果你想允许一个日期型(DateFieldTimeFieldDateTimeField)或数字型(IntegerFieldDecimalFieldFloatField)字段为空,你需要使用null=True * 和* blank=True

  为了举例说明,让我们把Book模块修改成允许 publication_date为空。修改后的代码如下:  

 class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
#**内为修改的内容
publication_date = models.DateField(**blank=True, null=True** )

自定义字段标签

  在编辑页面中,每个字段的标签都是从模块的字段名称生成的。 规则很简单: 用空格替换下划线;首字母大写。例如:Book模块中publication_date的标签是Publication date。

  然而,字段名称并不总是贴切的。有些情况下,你可能想自定义一个标签。 你只需在模块中指定verbose_name

  举个例子,说明如何将Author.email的标签改为e-mail,中间有个横线。  

 class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, **verbose_name='e-mail'** )
#**号内为修改内容

  请注意,你不必把verbose_name的首字母大写,除非是连续大写(如:"USA state")。Django会自动适时将首字母大写,并且在其它不需要大写的地方使用verbose_name的精确值。最后还需注意的是,为了使语法简洁,你可以把它当作固定位置的参数传递。 这个例子与上面那个的效果相同。

 class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(**'e-mail',** blank=True)#**号内为修改内容

  但这不适用于ManyToManyField 和ForeignKey字段,因为它们第一个参数必须是模块类。 那种情形,必须显式使用verbose_name这个参数名称。

最新文章

  1. Spring4 实例
  2. js 字符串转换成数字的三种方法
  3. BZOJ4584 : [Apio2016]赛艇
  4. Swift 协议
  5. android 抓包 使用 tcpdmp + Wireshark
  6. AndroidStudio-OSX 常用快捷键整理
  7. Python 学习之进制与编码
  8. HTML head 头标签
  9. max texture size of ios device
  10. 安森美电量计采用内部电阻跟踪电流--电压HG-CVR
  11. 关于mssql数据库锁和事务隔离级别
  12. delphi webbrowser 经常用法演示样例
  13. windows phone 了解LinearGradientBrush类和RadialGradienBrush类(11)
  14. C#数组和集合
  15. WPF转换器之通用转换器
  16. Web标准的简单理解 不同内核浏览器的差异以及浏览器渲染简介(转)
  17. HTTP协议、Ajax请求
  18. Altium Designer 10 快捷键笔记
  19. python 获取当前路径
  20. DBGridEh使用指南改变边框颜色

热门文章

  1. html便民查询各个工具类实例代码分享(支持pc和移动端)
  2. nvcc 编译显示寄存器使用情况
  3. DB2数据库常用语句
  4. sql server2016安装程序图
  5. graylog日志收集过程举例
  6. Sonar服务器搭建
  7. PHP:php遍历数组 foreach echo() list()总结
  8. Android(java)学习笔记80:Html嵌入到Java显示乱码
  9. Android(java)学习笔记87:Android音视频MediaRecorder用法
  10. 一键备份脚本 backup.sh