本节内容我们将配置数据库,创建第一个model并且快速了解Django自动生成的管理后台(admin site)

目录

数据库配置

打开上一节中新建的项目的配置文件,它是一个普通的python模块。

默认情况下,数据库配置使用SQLite,如果你数据库的新手,或者你仅仅是对Django感兴趣,这是最好的选择。SQLite包含在Python,所以不需要安装任何东西。当你开始你的第一个真正的项目的时候,你可能想

要使用更强大的数据库如PostgreSQL,去避免切换数据库的痛苦。

如果你希望使用另外一个数据库,需要安装对应的数据库驱动并且修改键DATABASES'default'项为匹配的数据库连接设置:

  • ENGINE - 'django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql',或者'django.db.backends.oracle', 还有其他的后端引擎
  • NAME - 数据库名称,如果你使用SQLite,设置为你的数据库文件所在的路径;这种情况下NAME是一个完整的绝对路径,包含文件名,默认值为:os.path.join(BASE_DIR, 'db.sqlite3'),这个文件将存放在你项目所在的目录。

如果你不使用SQLite作为你的数据库,那么需要另外的设置如:USER,PASSWORD,和HOST必须要添加。关于databases的详细配置我们将单独讲解。

对于SQLite以外的数据库

如果你使用SQLite以外的数据库,请确保你已经创建了一个数据库,也要确保在mysite/settings.py中提供的用户具有“创建数据库”的权限,允许自动创建一个测试数据库在后面的教程中将会用。如果你使用SQLite不需要做任何事情,数据库文件将会在你需要的时候自动创建。

另外,注意在mysite/settings.py文件的顶部INSTALLED_APPS设置,里面包含当前项目中所有被激活的Django应用的名称。应用可以在多个项目中使用,你可以打包并分发给其他的项目使用。

默认情况下,INSTALLED_APPS包含如下应用:

  • django.contrib.admin - 一个管理后台。下面很快将会用到它
  • django.contrib.auth - 一个认证系统。
  • django.contrib.contenttypes - 一个文档内容类型的框架
  • django.contrib.sessions - 一个session框架
  • django.contrib.messages - 一个消息框架

这些应用至少使用数据库中的一个表,虽然如此,在我们使用它们之前我们需要在一个数据库里面创建表,可以运行下面的命令做到它:

  1. $ python manage.py migrate

migrate命令将查找INSTALLED_APPS的设置,并且创建符合你在mysite/settings.py文件中配置的数据库的任何有必要的数据库表并且随应用迁移,如果说INSTALLED_APPS里面的应用不需要的话那么在运行migrate之前把它注释或删除掉即可。

创建模型

现在我们定义模型,在我们创建的投票应用中,我们创建两个模型:QuestionChoice。Question模型有一个问题内容和一个发布时间。Choice有两个字段:选择文本和投票数。ChoiceQuestion是多对一的关系。

这些概念我们用Python类来代表,编辑 polls/models.py 文件:

  1. from django.db import models
  2.  
  3. class Question(models.Model):
  4. question_text = models.CharField(max_length=200)
  5. pub_date = models.DateTimeField('date published')
  6.  
  7. class Choice(models.Model):
  8. question = models.ForeignKey(Question, on_delete=models.CASCADE)
  9. choice_text = models.CharField(max_length=200)
  10. votes = models.IntegerField(default=0)

代码很简单,每一个模型是一个继承django.db.models.Model的子类,每一个模型具有很多类变量,每一个变量代表一个数据库字段。每一个字段都是有一个Field类的实例来表示,例如,CharField代表字符字段和DateTimeField代表日期字段。这就告诉Django每一个字段是什么数据类型。Field类的实例的名称(如,choice_text),就是数据库表的字段名。

有些Field类是需要必须参数的,比如CharField,必须要提供max_length的参数。它不仅仅会在数据库架构中用,在验证中也会用到。一个字段可以有多个可选参数,在本例中,我们设置votes的默认值为0;

最后,注意在本例中使用ForeignKey定义了一个关系,它告诉Django每个Choice对应一个Question。Django支持所有的数据库关系:多对一,多对多,一对一。

激活模型

简单的模型定义告诉Django很多信息,有了他,Django可以:

  • 创建一个针对这个应用的数据库架构。
  • 创建一个Python数据库访问API来访问QuestionChoice对象。

但是首先需要告诉我们的Django项目polls应用已经被安装了。再次编辑mysite/settings.py文件,修改INSTALLED_APPS,把'polls.apps.PollsConfig'加入列表,如下所示:

  1. INSTALLED_APPS = [
  2. 'polls.apps.PollsConfig',
  3. 'django.contrib.admin',
  4. 'django.contrib.auth',
  5. 'django.contrib.contenttypes',
  6. 'django.contrib.sessions',
  7. 'django.contrib.messages',
  8. 'django.contrib.staticfiles',
  9. ]

  注意:INTALLED_APPS列表直接写应用的名称也是可以的(如,'polls'),官方建议是写AppConfig的子类,'polls.apps.PollsConfig'PollsConfig,这个类在创建应用时已经自动创建好了,在polls/apps.py文件里面定义,这个类里面可以定义关于应用的一些元数据如应用名称,描述等信息,Django提供了一些公用API可以读取里面的配置信息,暂时没有发现其他什么特别的用处。

现在Django已经知道包含了polls应用了,运行另外一个命令:

  1. $ python manage.py makemigrations polls

你可以看到如下的内容:

  1. Migrations for 'polls':
  2. polls/migrations/0001_initial.py:
  3. - Create model Choice
  4. - Create model Question
  5. - Add field question to choice

通过运行makemigrations,就是告诉Django项目模型已经有了那些修改,并且存储这些修改信息在polls/migrations/0001_initial.py文件中。

如果你想查看迁移将在数据库中执行哪些操作,可以运行命令:

  1. $ python manage.py sqlmigrate polls 0001

你将可以看到迁移所用到的Sql语句。

注意以下几点:

  • 输出的内容会根据你使用的数据库的不同而不同。
  • 表明是通过合并应用名称和模型名字的小写自动生成的(如,polls_question)(可以重写)。
  • 主键(id)是自动添加的(可以重写)
  • 通常情况下,Django会在模型名字基础上追加“_id”作为外键字段的名字。(可以重写)
  • sqlmigrate命令不在数据库上更改,仅仅是打印迁移的sql语句。

如果你感兴趣的话可以运行python manage.py check来检查你项目中的任何问题。

现在运行migrate命令在数据库里创建这些表:

  1. $ python manage.py migrate
  2. Operations to perform:
  3. Apply all migrations: admin, auth, contenttypes, polls, sessions
  4. Running migrations:
  5. Rendering model states... DONE
  6. Applying polls.0001_initial... OK

迁移的命令是非常强大的,让你可以随时修改你的模型,而不需要删除你的数据库或表,可以很方便升级你的数据库,不会丢失数据,后面会详细介绍他们,现在你只要记住需要三步来应用模型的变化:

  • 修改模型(在models.py)。
  • 运行python manage.py makemigrations创建这些修改迁移。
  • 运行python manage.py migrate应用这些修改到数据库。

使用API

现在,让我们进入Python shell的交互式环境并且使用Django提供的免费API。使用如下命令进入python shell:

  1. $ python manage.py shell

这个命令是进入我们项目的shell交互环境,现在我们可以使用API来操作表:

  1. # 创建一个问题,Django默认有日期模块,所以这儿使用timezone
  2. >>> from django.utils import timezone
  3. >>> q = Question(question_text=”Whats New?”,pub_date=timezone.now())
  4. # 保存对象到数据库,你必须明确调用save()方法
  5. >>> q.save()
  6. # 现在你可以访问model字段的值了
  7. >>> q.id
  8. 1
  9. >>> q.question_text
  10. Whats new?”
  11. # 修改你要修改的属性,然后调用save()方法
  12. >>> q.question_text=”Whats up?”
  13. >>> q.save()
  14. # 查询所有问题信息
  15. >>> Question.objects.all()
  16. <QuerySet [<Question: Question object>]>
  17. # 查询投票选择
  18. >>> q.choice_set.all()

上面的查询信息返回<QuerySet [<Question: Question object>]>,我们不知道这个对象都有什么东西,那么怎么解决这个问题呢,接下来分别在QuestionChoice增加__str__方法,编辑文件polls/models.py

  1. from django.db import models
  2. from django.utils.encoding import python_2_unicode_compatible
  3.  
  4. @python_2_unicode_compatible # 如果需要支持python 2.x的话,加上这个修饰符
  5. class Question(models.Model):
  6. # ...
  7. def __str__(self):     # 在python 2.x中,函数名为__unicode__
  8. return self.question_text
  9.  
  10. @python_2_unicode_compatible # 如果需要支持python 2.x的话,加上这个修饰符
  11. class Choice(models.Model):
  12. # ...
  13. def __str__(self):     # 在python 2.x中,函数名为__unicode__
  14. return self.choice_text

再次进入python shell环境,查看所有信息:

  1. >>> Question.objects.all()
  2. <Question: Whats up>

介绍Django管理后台

这个后台主要是方便客户或员工来管理网站内容的

创建管理员

首先我们需要创建一个可以登录到管理站点的用户,运行下面的命令:

  1. $ python manage.py createsuperuser

按照提示输入用户名、邮箱地址、密码;现在管理员用户已经创建好了,输入命令python manage.py runserver启动开发服务器,然后在浏览器输入地址 http://127.0.0.1:8000/amdin,就可以用我们刚刚创建的用户登录系统。

将应用注册到管理系统

登录后系统我们发现,在管理界面首页并没有我创建的投票应用,那么现在我们来看一下我们的应用如何注册到管理系统,编辑文件polls/admin.py

  1. from django.contrib import admin
  2.  
  3. from .models import Question
  4.  
  5. admin.site.register(Question)

现在Question已经注册了,打开后台管理的首页就可以看到我们的应用:

现在你可以对Question进行管理了。

注意一下几点:

  • 表单是根据Question模型,自动生成的。
  • 不同的模型字段类型由相应的HTML输入组件表示。

注意:在后台管理系统设置好后,如果系统的图片都显示不出来,需要在mysite/settings.py 加入如下设置:

  1. import mimetypes
  2.  
  3. mimetypes.add_type("image/svg+xml", ".svg", True)
  4. mimetypes.add_type("image/svg+xml", ".svgz", True)

可能是因为系统中没有SVG媒体类型的设置。

第二节:模型(Models)和管理后台(Admin site)的更多相关文章

  1. flask设置cookie,设置session,模拟用户认证、模拟管理后台admin、模拟用户logout

    设置cookie HTTP协议是无状态的,在一次请求响应结束后,服务器不会留下关于客户端状态的信息.但是对于某些web程序来说,客户端的信息有必要被记住,比如用户的登录状态,这样就可以根据用户的状态来 ...

  2. django之创建第9个项目-管理后台admin

    django之创建第9个项目-管理后台admin配置 1.配置setting文件INSTALLED_APPS = (    'django.contrib.auth',    'django.cont ...

  3. 【tornado】系列项目(一)之基于领域驱动模型架构设计的京东用户管理后台

    本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”. 一.预备知识: 1.接口: python中并没有类似java等其它语言中的接口类型,但是python中 ...

  4. django学习-26.admin管理后台里:修改登录页面标题,修改登录框标题,修改首页标题

    目录结构 1.前言 2.完整的操作步骤 2.1.第一步:查看[site.py]的源码 2.2.第二步:在应用[hello]所在目录里的[admin.py]里重写三个属性的属性值 2.3.第三步:重启服 ...

  5. 万里长征第二步——django个人博客(第五步 ——配置后台admin)

    在urls.py文件中配置admin路径 from django.conf.urls import url from django.contrib import admin from blog.vie ...

  6. Django admin site应用

    django自带的admin后台管理,可以实现对数据库表的增删改查,用起来十分方便.其使用和配置主要分为三个步骤: 1,创建超级用户 需要创建超级用户来登陆admin后台系统,在命令行中输入 pyth ...

  7. 四、Django之模型与管理后台-Part 2

    一.数据库安装 打开mysite/settings.py配置文件,这是整个Django项目的设置中心.Django默认使用SQLite数据库,因为Python源生支持SQLite数据库,所以你无须安装 ...

  8. django学习-25.admin管理后台里:把表名称和表字段名称的展示值都由英文显示改为由中文显示

    目录结构 1.前言 2.完整的操作步骤 2.1.第一步:修改模型类Article 2.2.第二步:重启服务 2.3.第三步:退出登录并再次成功登陆admin管理后台 2.4.第四步:查看最新的表名称展 ...

  9. 第五章:Admin管理后台 - 1:自定制Admin

    如果只是在admin中简单的展示及管理模型,那么在admin.py模块中使用admin.site.register将模型注册一下就好了: from django.contrib import admi ...

随机推荐

  1. Linux Shell 2>&1 &

    转  脚本如: nohup /mnt/Nand3/H2000G >/dev/null 2>&1 & 对 于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就 ...

  2. Tomcat8 localhost+端口可以访问Manager APP,而IP+端口不可以访问 解决办法

    localhost + 端口可以正常访问Manager APP,而IP + 端口不能访问Manager APP,报403错误.(我的主机环境是Ubuntu16.04) 前提是你已经配好了tomcat_ ...

  3. GridView获取CheckBox的值及所在列的ID

    //根据GridView的列数进行循环 ; i < GridView1.Rows.Count; i++) { //检查是否有ID为CheckBox1的CheckBox控件,如果有就赋值给Chec ...

  4. 浏览器 私有属性&内核

    -moz代表firefox浏览器私有属性 -ms代表IE浏览器私有属性 -webkit代表chrome.safari私有属性 IE使用的是Trident内核,Firefox 使用的是Gecko内核.目 ...

  5. Asp.net Web.Config - 配置元素 caching

    Asp.net Web.Config - 配置元素 caching 记得之前在写缓存DEMO的时候,好像配置过这个元素,好像这个元素还有点常用. 一.caching元素列表   元素 说明 cache ...

  6. 对上次“对字符串进行简单的字符数字统计 探索java中的List功能 ”程序,面向对象的改进

    之前的随笔中的程序在思考后发现,运用了太多的static 函数,没有将面向对象的思想融入,于是做出了一下修改: import java.util.ArrayList; import java.util ...

  7. 更新记录后关闭子窗口并刷新父窗口的Javascript

    有时我们需要在新打开的窗口里面编辑信息,等编辑完了,需要将当前窗口关闭并且刷新父窗口,以使修改生效,本文就是介绍用 javascript 来实现"更新记录后关闭子窗口并刷新父窗口" ...

  8. block,inline和inline-block概念和区别(转)

    转自  http://www.cnblogs.com/KeithWang/p/3139517.html 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-lev ...

  9. 每次Xcode 升级之后 插件失效,两步解决

    以下内容来源:http://www.cocoachina.com/bbs/read.php?tid=296269 每次Xcode 升级之后 插件失效,两步解决 1.打开终端,输入以下代码获取到DVTP ...

  10. SQL Server如何编辑超过前200行的数据

    从SQL Server 2008开始,微软为了提高查询效率等原因,右键点击表时弹出菜单中默认没有"显示所有行",而以"选择前1000行"替代.这有时会为我们带来 ...