请选择 进入手机版 | 继续访问电脑版
开启辅助访问 设为首页收藏本站

从零开始学编程-编程学习教程分享,编程技术交流论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 204|回复: 0

[python] Django实现TodoList项目

[复制链接]

1072

主题

1795

帖子

3707

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3707

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2019-10-14 16:41:07 | 显示全部楼层 |阅读模式

Django实现TodoList项目


一、     Django是什么样子的
1.   验证工作(是否安装成功)
在window上创建并运行网页
[mw_shl_code=python,true](myvenv) C:\path\to\your\project> django-admin startproject mysite .[/mw_shl_code]

!!!记得不要漏掉命令后面的小点(.:django-admin startproject mysite .
此时,符号"."很重要,它将告诉 django-admin 自动初始化项目 到你当前选择的目录中(所以这个“.”是告诉脚本执行时的一个相对路径, 『.』 代表当前所在路径)

前面的命令正确的话,你现在就应该有一个目录结构,看起来像下面这样:
djangogirls
├───manage.py
└───mysite
        settings.py
        urls.py
        wsgi.py
        __init__.py
它是一个Django的项目文件夹,为即将开始的项目准备好了必要的资源文件和文件夹

manage.py 是一个帮助管理站点的脚本。在它的帮助下我们将能够在我们的计算机上启动一个 web 服务器,而无需安装任何东西。
settings.py 文件包含的您的网站的配置数据。
要记住的唯一一点是不要不小心删除和重命名他们!

在控制台运行 python manage.py runserver 开启 web 服务器:
[mw_shl_code=python,true]cd /path/to/your/project
(myvenv) /path/to/your/project$ python manage.py runserver 0.0.0.0:8000
[/mw_shl_code]

浏览器输入网址:http://127.0.0.1:8000/

无标题.png

2.   DjangoAPP
为了让一切保持整洁,在项目内部单独创建应用程序。
(myvenv) ~/project$ python manage.py startapp todolist
.
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── todolist
    ├── __init__.py
    ├── admin.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

4 directories, 16 files
创建应用程序后,我们还需要告诉 Django 它应该使用它。在 mysite/settings.py文件中找到 INSTALLED_APPS 并在它下面添加一行'todolist' 。


INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
'django.contrib.staticfiles',

    'todolist'
)


3.   Djangourls
URL 在 Django 中如何工作?

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
]
正如你所看到的,Django 已经为我们放了一些例子在里面。
这表示对于每一个以 admin 开头的 URL,Django都会找到一个相对应的 view。 在这行代码中,包含了许多 admin URL 进来,所以这些 URL 不需要都被打包进这个小文件中。这使得代码更具可读性和简洁性。
是时候创建第一个 URL 了!
比如用 'http://127.0.0.1:8000/' 作为一个展示时间的网页

为了保持 mysite/urls.py 文件简洁,从 todolist 应用导出 urls 到主 mysite/urls.py 文件。
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('todolist.urls')),
]


现在,Django 会把访问 'http://127.0.0.1:8000/' 的请求转到 todolit.urls

创建一个新的 todolist/urls.py 空文件。加入以下两行:
[mw_shl_code=python,true]from django.conf.urls import url
from . import views
[/mw_shl_code]

我们仅仅把 Django 的方法以及 todolist 应用的全部 views 导入了进来。(目前什么都没有,但是不超过一分钟就能搞好!) 然后,我们可以加入第一个 URL 模式:
[mw_shl_code=python,true]urlpatterns = [
    url(r'^$', views.index, name='index'),
]
[/mw_shl_code]

分配了一个叫作 indexview^$ 的 URL 上。 这个正则表达会会匹配 ^(表示开头)并紧随 $ (表示结尾),所以只有空字符串会被匹配到。在 Django 的 URL 解析器中,'http://127.0.0.1:8000/' 并不是 URL 的一部分。(译注:即只有 'http://127.0.0.1:8000/'后面的部分会被解析。如果后面的部分为空,即是空字符串被解析。) 这个模式告诉了 Django,如果有人访问 'http://127.0.0.1:8000'地址,那么 views.index 请求到相应地方。
最后的部分,name='index' 是 URL 的名字,用来唯一标识对应的 view。 它可以跟 view 的名字一样,也可以完全不一样。 在项目后面的开发中,我们将会使用命名的 URL ,所以在应用中为每一个 URL 命名是重要的。应该尽量让 URL 的名字保持唯一并容易记住。

4.   todolist/views.py
[mw_shl_code=python,true]from django.shortcuts import render

# Create your views here.
[/mw_shl_code]

这里没有太多的东西。我们改动一下这个文件,一个最简单的view就长得这个样子。
[mw_shl_code=python,true]from django.http import HttpResponse
import datetime

def index(request):
    message = "当前时间:{}".format(datetime.datetime.now())
    return HttpResponse(message)
[/mw_shl_code]
string.format 是一个格式化字符串的函数。
datetime 是一个自带的日期库,datetime.datetime.now 返回一个当前日期的字符串。
def创建名为 index 的方法,接收 request 参数作为输入, 并 return 用 HttpResponse 方法将一个字符串返回给 client保存文件

二、     TodoList项目
“你喜欢旅行,喜欢夏日西西里岛海风的清新、喜欢冬日南半球飘丝薰衣草庄园的烂漫,还想亲自登上乞力马扎罗雪山去看雪。你把这些计划写在了 TodoList 上,然后再去一一实现。在 Matterhorn 的峰顶,你点下完成,你心怀满足。
你喜欢锻炼,喜欢在健身房挥洒汗水、喜欢不知道是哪清晨的阳光,还喜欢一个人夜跑享受激情与宁静。你把这些计划写在了 TodoList 上,然后再去一一实现。看着日渐结实的自己,你点下完成,你心怀满足。
你喜欢生活,喜欢子夜欣赏幽静的昙花一现,喜欢在湖边聆听空灵的雨声蛙鸣,还喜欢在细微之处观察生活的点点滴滴。你在 TodoList 上写下这些精彩的瞬间,在不经意的时候实现。再翻阅这些生活的美好,你点下了完成,你心怀满足。
你喜欢自律、你喜欢高效率的工作、你喜欢......“——选自《我也不记得了》
1.   数据库设计
在开发实际的程序之前我们应该简单的设计一下我们的程序,首先是数据设计。
目标:为了实现一个存储每个 Todo-Item 数据
需要几种数据:
(1)Todo-Item 的标题;
(2)description 值来对每个 Item 进行更为详细的描述;
(3)每个 Item要用一个 Flag 来记录当前条目的状态,就是说这条 todo 是不是已经完成了,通过区分这个我们可以提供一些视觉上的区分方法,来区分我们的 todo 是否完成(比如说给已经完成的条目添加删除线)。
(4)createAt 时间戳来记录我们的本条 todo 的创建时间;
(5)updateAt 的时间戳来记录我们更新的时间。

在应用 todolist 的 model.py 文件中写下如下的代码:
[mw_shl_code=python,true]from django.db import models

class Todo(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    completed = models.BooleanField(default=False)
    createdat = models.DateTimeField(auto_now_add=True)
    updatedat = models.DateTimeField(auto_now=True)
[/mw_shl_code]
引入了 django.db 的 models ,并且让所要实现的数据库集成这个类,并且将刚才已经讨论出来的结果的属性存储,作为类的属性,这样子我们就能定义一个包含这些属性的类。
使用 models
虽然能够定义了这样的一个数据类去控制和这个模板所对应的一个数据类,但还要告诉程序能找到这个数据库,并且为整个程序提供这个数据库。

在 setting.py 文件中安装包含有 models.py 文件的应用:
[mw_shl_code=python,true]INSTALLED_APPS = [
    #...
    'todolist',
    #...
]
[/mw_shl_code]

然后我们在根目录运行两条命令就可以生成出我们所需要的数据库:
[mw_shl_code=python,true]$ python manager.py makemigrations[/mw_shl_code]
使用这条命令可以对model 进行操作,无论是添加一个 Field 或者是删除一个 Model 都可以通过这条命令来修改:
代码1.png

在生成修改之后通过:
[mw_shl_code=python,true]$ python manager.py migrate[/mw_shl_code]
就能把刚才产生的修改应用到数据库中:
代码2.png
定义的数据库类,生成出对应的 SQL 并且应用,产生数据库文件 db.sqlite3。
Model中的属性 Field

在刚刚的数据类中,有很多子属性,代表了其中的多种的数据类:
[mw_shl_code=python,true]  title = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    completed = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
[/mw_shl_code]


  • max_length :     CharField 和其子类都需要设定一个最大的长度。
  • blank : 允许数据为空白,默认是     False
  • default default     值设置了当前属性的默认值,比如这里我们把 completed 的值设置为默认是未完成的     False
  • auto_now :取当前的时间戳,当当前对象被     saved 的时候,使用最后一次修改的时间戳作为这个     DataTimeField 的值。
  • auto_now_add : 只取出我们的     Model 第一次创建时当时的时间戳,作为     DataTimeField 的值。

另外创建的每个 Model 都会有默认的一个 id 属性作为一个自增主键:
[mw_shl_code=python,true]id = models.AutoField(primary_key=True)[/mw_shl_code]
如果不想设置其他的主键来区分 Model ,就可以只默认的使用这个 id 作为区分。

元数据选项
[mw_shl_code=python,true]from django.db import models

class Todo(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    completed = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('completed', '-updated_at',)
[/mw_shl_code]
通过 inner class 的方式为Model 类提供非数据类的额外的数据,Meta Option提供了多种的属性去控制数据类。
比如在这里面使用了 ordering 这个Meta 属性,这个属性控制了获取全部的数据的顺序,ordering 本身接受的是一个元组,里面的每一项都是 Model 的一个Field,拿到的全部的数据,按照元组中的顺序对数据进行排序。但是这里面出现了一个属性写着 -updated_at 的字样属性多了一个减号,这个的意思是按照降序的方式对数据进行排序。
因此上面实际上在做的就是先把所有的数据先按照是否完成来开始排序,然后再按照最后的更新时间来继续更新。
2.    Url 逻辑设计

之前也介绍过使用 Urls 部分的程序设计,我们使用正则表达式去对 urls 进行捕获
[mw_shl_code=python,true]from django.conf.urls import url
from django.contrib import admin
from todolist import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.todolist),
    url(r'^delete/(?P<pk>\d+)/', views.delete),
    url(r'^complete/(?P<pk>\d+)/', views.complete),
]
[/mw_shl_code]

从上面的代码来看,支持了这样几个 Action / 路由:
·        默认的 admin 管理界面
·        打开 todolist 的主界面
·        删除一个具体 todo-item 的路由
·        设置某一个具体 todo-item 为完成的路由
模板(template) 是一种Django 中提供的一种编写界面的方式,因为我们需要提供网页的动态性,就需要一种方式能生成动态的 HTML 的方式。因此 Django 中的模板就是一种提供在 HTML 中的一种 DSL 语言,提供一些动态化的语法 能动态的控制渲染的 HTML 的样式和界面,由后端渲染上界面上去,然后再展示在用户的眼前。

模板引擎其实也是做了这样的一个事情,接收动态接到的数据,生成出对应的 HTML 代码,生成出整张页面发送给用户。
代码3.png
3.   配置 Template 路径

在 settings.py 文件中对使用的模板引擎进行配置:
[mw_shl_code=python,true]TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
[/mw_shl_code]
BACKEND :在 BACKEND 后端这个字段配置了为了模板使用的模板引擎,这里使用默认的配置就行了。
DIRS:我们在 DIRS 中配置的是模板引擎中处理的模板文件的具体的位置,这里设置为根目录下的 templates 文件夹。

APP_DIRS : 配置的是模板引擎是否对 APP 内的模板进行处理。
模板语法(忘了的话复习一下):

可以通过模板语言中,动态的向网页中插入多种格式化的数据(HTML, XML, CSV等等),在模板中可以包含变量,在对模板进行 求值生成界面 的时候将变量动态的替换进去,另外模板语法还支持使用各种流程控制的 Tag 能让控制模板生成的流程:
[mw_shl_code=python,true]{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
[/mw_shl_code]
4.   定义方法
代码4png.png
在view.py中定义方法

通过对点击完成或是删除都会调用 views.py 中对应的程序:
[mw_shl_code=python,true]def delete(request, pk):
    todo = get_object_or_404(Todo, id=pk)
    todo.delete()
    return HttpResponseRedirect('/')


def complete(request, pk):
    todo = get_object_or_404(Todo, id=pk)
    todo.completed = True
    todo.save()
    return HttpResponseRedirect('/')
[/mw_shl_code]
这部分的实现也都很简单,删除或是完成,不过是修改状态,或是找到对应的 item 直接删除掉。

5.   本地访问测试成功

本地访问测试

本地访问测试

投稿人:kingsman <kingsman.z@qq.com>
邀请码已经发送到该邮箱,请查收


不积跬步,无以至千里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

展开

QQ|Archiver|手机版|小黑屋|从零开始学编程 ( 豫ICP备15032706号-2 )

GMT+8, 2019-11-22 02:41 , Processed in 0.102071 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表