django_todo

django

介绍

版本:1.x 和 2.x, 2.x不支持python2版本,只支持py3.5及以上版本。1.x路由正则风格 2.x路由风格简单类似flask。

优点:大而全,封装多种功能,开箱即用。目录结构适合中大型程序。缺点,内含的功能有些用不上。

教程

  1. 确认python版本和django版本已安装。python -m django --version
  2. 新建工程项目
    django-admin startproject mysite
  3. 项目目录结构
    根目录下manage.py启动服务的入口。跟项目同名的mysite文件夹下是主要项目代码。有的项目中这个文件夹又叫做app、src。settings.py设置,urls.py路由。wsgi.py打包应用部署相关。
  4. 启动项目 python manage.py runserver
  5. 生成应用 python manage.py startapp polls 。project是项目工程,app应用是项目中一个功能模块。polls目录下migrations是sql迁移脚本,admin.py后台插件,apps.py ,models.py定义表结构的类,
    tests.py单元测试,views.py业务逻辑和HTML渲染。

orm操作

  1. 查询表中所有数据
    Question.objects.all() 返回model对应table的所有行
  2. 插入数据 默认自动提交。
    q = Question()
    q.save()
  3. 带条件查询
    类.objects.filter(列=值,列2=值2)
  4. 模糊匹配 字段后跟表示特殊操作__开头
    类.objects.filter(字段__startswith=‘匹配子串’)
  5. 查询除了filter,也可以get,功能一致
    类.objects.get(列=值)
    get查询不到报异常。(推荐)filter查询不到返回空结果集。filter返回QuerySet结果集,get返回Question实例。
  6. 类实例相当于表中一行数据,可以调用实例方法
    q = Question.objects.get(id=1)
    q.方法()
  7. 反向查询
    需求,查询question表中“下周五考试吗”这个问题对应的选项,如果是sql,要先select id from question表 where text=“下周”得到qid,再select * from choice where question_id=qid;
    而orm帮我们只需要 q.关联表_set.all()。
    优点省一条查询代码缺点不太好理解。
  8. 一对多关系
    先把一的一方的表的一行数据get出来,
    q = Question.objects.get(id=1)
    然后反向查询关联创建q.choice_set.create(choice_text=’’)
  9. 删除
    q = Question.objects.get(id=1)
    q.delete()

配置

mysite/settings
DATABASE{} , engine 用哪种数据库, name 数据存储文件名
其它需要关注的配置:
INSTALLED_APPS django数据库迁移时会检查installed apps中的应用涉及到的类,根据类生成sql。如果模块应用未添加到此配置,那么模块下models.py中定义的类不会生成表。
TIME_ZONE USE_TZ 保持默认。
大部分保持默认即可。

迁移migrate数据库

  1. settings.py INSTALLED_APP 插上应用
  2. python manage.py makemigrations polls 根据模块下models.py生成迁移脚本
  3. (选做)python manage.py sqlmigration polls 0001 查看sql语句。
  4. python manage.py migrate 执行迁移脚本

##、数据模型(model.py

   在当代 Web 应用中,主观逻辑经常牵涉到与数据库的交互。 数据库驱动网站在后台连接数据库服务器,从中取出一些数据,然后在 Web 页面用漂亮的格式展示这些数据。这个网站也可能会向访问者提供修改数据库数据的方法。由于先天具备 Python 简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站。
   Django 的设计鼓励松耦合及对应用程序中不同部分的严格分割。 遵循这个理念的话,要想修改应用的某部分而不影响其它部分就比较容易了。把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller(MVC)模式。 在这个模式中, Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。
   Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含义:
   M,数据存取部分,由django数据库层处理。
   V,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。
   C,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的Python 函数。

   由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
   M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效

性、包含哪些行为以及数据之间的关系等。

   T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
   V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

   在TodoList的案例中,我们的数据模型主要包含一下的一些字段:用户名、todo内容、是否完成的标志位、优先级、发布时间。我们使用python代码来描述这些字段,如下图所示:

在这里插入图片描述

   每个数据模型都是 django.db.models.Model 的子类。它的父类 Model 包含了所有必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。每个模型相当於单个数据库表,每个属性也是这个表中的一个字段。属性名就是字段名,它的类型(例如CharField )相当于数据库的字段类型 (例如 varchar )。我们并没有显式地为这些模型定义任何主键。 除非你单独指明,否则Django会自动为每个模型生成一个自增长的整数主键字段每个Django模型都要求有单独的主键id。

   输入“python manage.py sqlall SimpleTodo”命令,我们可以看到生成的SQL语句:



   按约定,Django添加 "_id" 后缀到外键字段名,用 REFERENCES 语句明确定义。在这个表中,user是外键,引用Django的内置权限控制系统,使用“from django.contrib.auth.models import User”引入。

   __unicode__() 方法告诉Python如何将对象以unicode的方式显示出来。内嵌类 "class Meta" 给你的 model 定义元数据,用于定义一些Django模型类的行为特性。比如ordering定义默认排序字段及排序方式, 用于得到一个对象列表的任何场合。

二、站点管理(admin.py
Django自动管理工具是django.contrib的一部分。django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,Django框架就是由众多包含附加组件(add-on)的基本代码构成的。 你可以把django.contrib看作是可选的Python标准库或普遍模式的实际实现。 它们与Django捆绑在一起,这样你在开发中就不用“重复发明轮子”了。管理工具是django.contrib的一个部分。从技术层面上讲,它被称作django.contrib.admin。django.contrib中其它可用的特性,如用户鉴别系统(django.contrib.auth)、支持匿名会话(django.contrib.sessioins)以及用户评注系统(django.contrib.comments)。

  基本的admin功能就不详述了,主要看一下我们的models是如何加入到Admin管理功能中的。在app的admin.py文件中,代码如下:

在这里插入图片描述

  admin.site.register()函数将我们之前定义的数据库表放到管理界面中,第一个参数就是之前定义的数据库模型,第二个参数是我们对显示字段的自定义显示方式,如果没有第二个参数则默认使用对象中的__unicode__()方法进行显示:

  list_display:一个字段名称的元组,用于列表显示,这些字段名称必须是模块中有的。

  list_filter:这个字段元组创建过滤器,它位于列表页面的右边。Django为日期型字段提供了快捷过滤方式,它包含:今天、过往七天、当月和今年。这些是开发人员经常用到的。、

  ordering:字段的排序方式,加上负号代表降序排列。

  通过下面两张图,我们可以明显看出来加入自定义函数后的效果(后者):

在这里插入图片描述

在这里插入图片描述

三、视图(views.py
一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,它必须满足这两个条件。本例中的view.py如下:

在这里插入图片描述

在这里插入图片描述

  一旦创建了模型,Django自动为这些模型提供了高级的Python API,可以让我们很方便的操作数据库。例如在第一个函数todolist中:

   使用`` Todo.objects`` 属性从数据库取出todo的信息,这个属性可以认为是包含todo的记录集,也就是我们的todolist。filter()是数据过滤方法,这里我们只取还没有完成的todolist(flag=1),已经完成的finishtodos采用同样的方法获取。最后通过模板把我们找到的数据显示出来,具体怎么漂亮的显示,那就是模板的工作了。

   在todofinish函数中,我们使用到了get()方法,通过id来获取单个对象(filter() 函数返回一个记录集)。使用HttpResponseRedirect对象将网页重定向至一个显示页面。否则,更新数据后再重新显示出来。

   当用户添加一个新的todo对象的时候,就要调用addtodo()函数了。POST数据是来自HTML中的〈form〉标签提交的,通过提交的数据,分别填充todo的各字段,然后调用模板显示。

四、URL配置
URLconf 就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个URL 调用那段代码。
这里我们使用了两个urls.py文件,分别放在项目和应用当中,这样清晰明了而且更具备移植性。需要注意到的就是在类似’^todofinish/(?P\d+)/$‘这样的表达式功能是匹配数字赋值给id并且作为后面函数的第二个参数。name参数的作用就是当你在template中写有{% url uploadify_script %}的时候能够直接找到url(’^uploadify_script’, ‘index’, name = ‘uploadify_script’),来执行程序,也就是执行views.py中的index函数。

五、模板
模板分为三个文件:simpleTodo.html,showtodo.html,updatatodo.html。具体代码就不贴出来了,可以直接从源码中查看。本人对html之类的没有多少开发经验,bootstrap、javascript,ajax之类的就更搞不明白了。不过对照模板中的代码,遇到不会的就上网查一下,还是可以看明白的,下面是我在学习过程中参考的一些网站:

1、Bootstrap 教程:http://www.w3cschool.cc/bootstrap/bootstrap-tutorial.html
2、Ajax教程:http://www.w3cschool.cc/ajax/ajax-tutorial.html
3、HTML5教程:http://www.w3cschool.cc/html/html5-intro.html

六、实现效果
1、首页

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章