Django初识 学习笔记一

Django

Posted by Cosmo-Ma on May 28, 2018

一 MVC框架

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

enter description here

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。   通常模型对象负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分。   通常视图是依据模型数据创建的。和html页面有关系。
  • Controller(控制器)是应用程序中处理用户交互的部分。   通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。接受请求,进行交互,与M和V进行交互,返回应答。

    二 MVT框架

    Django也是MVC框架。 但是,Django框架(内部的URLconf)作为控制器的角色,负责了接收用户请求和转发请求的工作,Django 里更关注的是模型(Model)、模板(Template)和视图(Views),故称之为 Django MVT 模式处理过程: Django框架接收了用户请求和参数后,再通过正则表达式匹配URL,转发给对应视图进行处理。视图调用M处理数据,再调用T返回界面给浏览器;

    enter description here

  • M:Model,模型, 和数据库进行交互,和MVC中M功能相同
  • V: View,视图, 接受请求,进行交互,与M和V进行交互,返回应答 和MVC中C 功能相同
  • T: Template,模板,产生html页面,和MVC中的v功能相同

三 第一个Django项目

命令:==django-admin startproject 项目名==

项目目录如下:

enter description here

  • __init__.py: 说明test1是一个python包。
  • settings.py: 项目的配置文件
  • urls.py: 进行url路由的配置
  • wsgi.py: web服务器和django交互的入口
  • manage.py: 项目的管理文件

一个项目由很多个应用组成的,每一个应用完成一个特定的功能。 创建应用的命令如下: ==python manage.py startapp 应用名== 应用目录如下:

enter description here

  • __init__.py: 说明目录是一个python模块
  • models.py: 写和数据库相关的内容
  • views.py: 接收请求,进行处理。和M,T交互,返回应答,
  • 定义处理函数,视图函数

==tests.py:写测试代码的函数== admin.py: 网站后台管理相关的文件 建立应用和项目之间的联系,需要对应用进行注册。(项目不知道应用在) 修改settings.py中的INSTALLED_APPS配置项。

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest', # 进行应用的注册
)

==运行开发web服务器命令:==

1
python manage.py runserver

四 ORM

ORM:Object Relational Mapping(关系对象映射) django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作。 设计类:模型类。 ORM另外一个作用:根据设计的类生成数据库中的表。

它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

4.1 模型类设计 在应用models.py中设计模型类。必须继承与models.Model类。 1) 设计BookInfo类。 2) 设计HeroInfo类。 Models.ForeignKey可以建立两个模型类之间一对多的关系,django在生成表的时候,就会在多的表中创建一列作为外键,建立两个表之间一对多的关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from django.db import models
# 设计和表对应的类,模型类
# Create your models here.

# 一类
# 图书类
class BookInfo(models.Model):
    '''图书模型类'''
    # 图书名称,CharField说明是一个字符串,max_length指定字符串的最大长度
    btitle = models.CharField(max_length=20)
    # 出版日期,DateField说明是一个日期类型
    bpub_date = models.DateField()

    def __str__(self):
        # 返回书名
        return self.btitle

# 多类
# 英雄人物类
# 英雄名 hname
# 性别 hgender
# 年龄 hage
# 备注 hcomment
# 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
class HeroInfo(models.Model):
    '''英雄人物模型类'''
    hname = models.CharField(max_length=20) # 英雄名称
    # 性别,BooleanField说明是bool类型,default指定默认值,False代表男
    hgender = models.BooleanField(default=False)
    # 备注
    hcomment = models.CharField(max_length=128)
    # 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
    # 关系属性对应的表的字段名格式: 关系属性名_id
    hbook = models.ForeignKey('BookInfo')

    def __str__(self):
        # 返回英雄名
        return self.hname

4.2 模型类生成表 1) 生成迁移文件 命令:python manage.py makemigrations

enter description here 迁移文件是根据模型类生成的。 2) 执行迁移生成表 命令:python mange.py migrate 根据迁移文件生成表。 生成表名的默认格式: 应用名_模型类名小写

4.3 通过模型类操作数据表 进入项目shell的命令:

1
python manage.py shell

4.4 以下为在相互shell终端中演示的例子: 首先导入模型类: from booktest.models import BookInfo,HeroInfo 1)向booktest_bookinfo表中插入一条数据。 b = BookInfo() #定义一个BookInfo类的对象 b.btitle =’天龙八部’ #定义b对象的属性并赋值 b.bpub_date = date(1990,10,11) b.save() #才会将数据保存进数据库 2)查询出booktest_bookinfo表中id为1的数据。 b = BookInfo.objects.get(id=1) 3)在上一步的基础上改变b对应图书的出版日期。 b.bpub_date = date(1989,10,21) b.save() #才会更新表格中的数据 4)紧接上一步,删除b对应的图书的数据。 b.delete() #才会删除 5)向booktest_heroInfo表中插入一条数据。 h = HeroInfo() h.hname = ‘郭靖’ h.hgender = False h.hcomment = ‘降龙十八掌’ b2 = BookInfo.objects.get(id=2) h.hbook = b2 #给关系属性赋值,英雄对象所属的图书对象 h.save() 6)查询图书表里面的所有内容。 BookInfo.objects.all() HeroInfo.objects.all()

4.5 关系操作

enter description here 1)查询出id为2的图书中所有英雄人物的信息。 b = BookInfo.objects.get(id=2) b.heroinfo_set.all() #查询出b图书中所有英雄人物的信息

五 后台管理

1) 本地化 语言和时区的本地化。 修改settings.py文件。

1
2
3
4
5
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 使用中文

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 中国时间

2) 创建管理员 命令:python manage.py createsuperuser

C:\Django\test1>python manage.py createsuperuser

You have 3 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth.
Run 'python manage.py migrate' to apply them.
Username (leave blank to use 't_maj'): admin
Error: That username is already taken.
Username (leave blank to use 't_maj'): Cosmo
Email address: cosmo.ma@outlook.com
Password:
Password (again):
Superuser created successfully.

3) 注册模型类 在应用下的admin.py中注册模型类。 告诉djang框架根据注册的模型类来生成对应表管理页面。 b = BookInfo() str(b) str 4) 自定义管理页面 自定义模型管理类。模型管理类就是告诉django在生成的管理页面上显示哪些内容。

六 视图

在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求的,视图函数处理之后,要给浏览器返回页面内容。 6.1 视图函数的使用 1)定义视图函数 视图函数定义在views.py中。 例:

1
2
3
		def index(request):
			#进行处理。。。
			return HttpResponse('hello python')

视图函数必须有一个参数request,进行处理之后,需要返回一个HttpResponse的类对象,hello python就是返回给浏览器显示的内容。 2)进行url配置

enter description here url配置的目的是让建立url和视图函数的对应关系。url配置项定义在urlpatterns的列表中,每一个配置项都调用url函数。 url函数有两个参数,第一个参数是一个正则表达式,第二个是对应的处理动作。 配置url时,有两种语法格式: a) url(正则表达式,视图函数名) b) url(正则表达式,include(应用中的urls文件)) 工作中在配置url时,首先在项目的urls.py文件中添加配置项时,并不写具体的url和视图函数之间的对应关系,而是包含具体应用的urls.py文件,在应用的urls.py文件中写url和视图函数的对应关系。 项目的url.py:

1
2
3
4
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)), # 配置项目
    url(r'^', include('booktest.urls')), # 包含booktest应用中的urls文件
]

应用的url.py:

1
2
3
4
5
6
7
urlpatterns = [
    # 通过url函数设置url路由配置项
    url(r'^index$', views.index), # 建立/index和视图index之间的关系
    url(r'^index2$', views.index2),
    url(r'^books$', views.show_books), # 显示图书信息
    url(r'^books/(\d+)$', views.detail), # 显示英雄信息
]

6.2 url匹配的过程 在项目的urls.py文件中包含具体应用的urls.py文件,应用的urls.py文件中写url和视图函数的对应关系。

enter description here

当用户输入如http://127.0.0.1:8000/aindex时,去除域名和最前面的/,剩下aindex,拿aindex字符串到项目的urls文件中进行匹配,配置成功之后,去除匹配的a字符,那剩下的index字符串继续到项目的urls文件中进行正则匹配,匹配成功之后执行视图函数index,index视图函数返回内容hello python给浏览器来显示。

七 模板

模板不仅仅是一个html文件。 7.1 模板文件的使用 1) 创建模板文件夹 2) 配置模板目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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',
            ],
        },
    },
]

使用模板文件 a) 加载模板文件 去模板目录下面获取html文件的内容,得到一个模板对象。 b) 定义模板上下文 向模板文件传递数据。 c) 模板渲染 得到一个标准的html内容。

1
2
3
4
5
6
7
8
9
10
11
12
from django.template import loader,RequestContext
def my_render(request, template_path, context_dict={}):
    '''使用模板文件'''
    # 使用模板文件
    # 1.加载模板文件, 模板对象
    temp = loader.get_template(template_path)
    # 2.定义模板上下文:给模板文件传递数据
    context = RequestContext(request, context_dict)
    # 3.模板渲染:产生标准的html内容
    res_html = temp.render(context)
    # 4.返回给浏览器
    return HttpResponse(res_html)

7.2 给模板文件传递数据 模板变量使用:==== 模板代码段: for循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板文件</title>
</head>
<body>
<h1>这是一个模板文件</h1>
使用模板变量:<br/>
<!-- Image to hack wechat -->
<!-- <img src="/img/icon_wechat.png" width="0" height="0"> -->
<!-- <img src="/img/post-bg-2015.jpg" width="0" height="0"> -->

<!-- Post Header -->



<style type="text/css">
    header.intro-header{
        position: relative;
        background-image: url('/img/post-bg-2015.jpg');
        background: ;
    }

    
</style>

<header class="intro-header" >

    <div class="header-mask"></div>
    
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <div class="tags">
                        
                        <a class="tag" href="/archive/?tag=%E8%82%A1%E7%A5%A8" title="股票">股票</a>
                        
                    </div>
                    <h1>股票交易</h1>
                    
                    <h2 class="subheading">"汤臣倍健和等股票交易"</h2>
                    <span class="meta">Posted by Cosmo-Ma on November 28, 2017</span>
                </div>
            </div>
        </div>
    </div>
</header>






<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">

    <!-- Post Container -->
            <div class="
                col-lg-8 col-lg-offset-2
                col-md-10 col-md-offset-1
                post-container">

                <!-- Multi-Lingual -->
                

				<blockquote>
  <p>“🙉🙉🙉 ”</p>
</blockquote>

<h2 id="正文">正文</h2>

<p>2017汤成倍健交易分析
买入原因:
业绩比较好:
营业收入:12.20%-&gt;20.60%-&gt;22.84%
净利润:25.78%-&gt;62.12%-&gt;41.37%
每股收益:-38.71%-&gt;60%-&gt;41.03%
净资产收益率:21.78%-&gt;59.77%-&gt;36.73%
综合诊断:4.5分
20171122 买入一手,成交价格14.88
20171123 买入一手,成交价格14.25
20171129 卖出一手,成交价格13.85
20171130 卖出一手,成交价格13.80
持股 七天,亏损 164.39,交易费16.39 亏损率5.83%,
遵守 亏损7%-8%卖出原则(中间不加仓实际亏损7.5%),
亏损原因分析:大盘走势很不好。
后续继续关注。
卖出第一天:创业板大涨2个点,汤成倍健只涨了一个点,还是弱势股。
卖出第三天:创业板大跌2个多点,汤臣倍健处于低位,跌了0.22%。
2017年12月5号复盘
今天创业板大跌2.18%.我亏损一个点,
买入弱势股宝硕股份,买入理由:已经阴跌了三个月,应该不会大跌,想低收高抛。
清仓旗滨集团,赚了一个多点,最多赚5个多点没有卖。
昨天买入金浦钛业,买入理由:有利好
结果行情不好,已经亏损4.689%
上周五买入长安汽车,买入理由:一汽,东风,长安三巨头牵手,汽车国家队全面合作的消息,中长期应该利好
目前亏损一个点。
上周买入中信证券,买入理由:权重股,证券一直处于低位,业绩不错。
目前涨了0.1%。</p>


                <hr style="visibility: hidden;">
                <ul class="pager">
                    
                    <li class="previous">
                        <a href="/2017/11/28/Hello-2017/" data-toggle="tooltip" data-placement="top" title="我的博客终于开通啦">
                        Previous<br>
                        <span>我的博客终于开通啦</span>
                        </a>
                    </li>
                    
                    
                    <li class="next">
                        <a href="/2018/05/28/Django1/" data-toggle="tooltip" data-placement="top" title="Django初识 学习笔记一">
                        Next<br>
                        <span>Django初识 学习笔记一</span>
                        </a>
                    </li>
                    
                </ul>
                <hr style="visibility: hidden;">

                
                <!-- disqus 评论框 start -->
                <div class="comment">
                    <div id="disqus_thread" class="disqus-thread"></div>
                </div>
                <!-- disqus 评论框 end -->
                

                
            </div>  

    <!-- Side Catalog Container -->
        
            <div class="
                col-lg-2 col-lg-offset-0
                visible-lg-block
                sidebar-container
                catalog-container">
                <div class="side-catalog">
                    <hr class="hidden-sm hidden-xs">
                    <h5>
                        <a class="catalog-toggle" href="#">CATALOG</a>
                    </h5>
                    <ul class="catalog-body"></ul>
                </div>
            </div>
        

    <!-- Sidebar Container -->
            <div class="
                col-lg-8 col-lg-offset-2
                col-md-10 col-md-offset-1
                sidebar-container">

                <!-- Featured Tags -->
                


<section>
    
        <hr class="hidden-sm hidden-xs">
    
    <h5><a href="/archive/">FEATURED TAGS</a></h5>
    <div class="tags">
        
        
        
        </a>
        
        
                <a data-sort="0041" 
                    href="/archive/?tag=Python"
                    title="Python"
                    rel="3">Python</a>
        
                <a data-sort="0008" 
                    href="/archive/?tag=%E7%AC%94%E8%AE%B0"
                    title="笔记"
                    rel="36">笔记</a>
        
                <a data-sort="0008" 
                    href="/archive/?tag=Coq"
                    title="Coq"
                    rel="36">Coq</a>
        
                <a data-sort="0008" 
                    href="/archive/?tag=SF+%28%E8%BD%AF%E4%BB%B6%E5%9F%BA%E7%A1%80%29"
                    title="SF (软件基础)"
                    rel="36">SF (软件基础)</a>
        
                <a data-sort="0025" 
                    href="/archive/?tag=PLF+%28%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80%29"
                    title="PLF (编程语言基础)"
                    rel="19">PLF (编程语言基础)</a>
        
                <a data-sort="0028" 
                    href="/archive/?tag=LF+%28%E9%80%BB%E8%BE%91%E5%9F%BA%E7%A1%80%29"
                    title="LF (逻辑基础)"
                    rel="16">LF (逻辑基础)
    </div>
</section>


                <!-- Friends Blog -->
                
<hr>
<h5>FRIENDS</h5>
<ul class="list-inline">
  
  <li><a href="https://www.cnblogs.com/ChinacloudTech/">博客园</a></li>
  
  <li><a href="https://github.com/FutureTechx/Gogoing">Golang</a></li>
  
  <li><a href="https://vuejs.org/">Vue</a></li>
  
</ul>

            </div>
        </div>
    </div>
</article>

<!-- add support for mathjax by voleking-->






<!-- disqus 公共JS代码 start (一个网页只需插入一次) -->
<script type="text/javascript">
    /* * * CONFIGURATION VARIABLES * * */
    var disqus_shortname = "futuretechx";
    var disqus_identifier = "/2017/11/28/stock";
    var disqus_url = "https://futuretechx.com//2017/11/28/stock/";

    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
</script>
<!-- disqus 公共JS代码 end -->




<!-- async load function -->
<script>
    function async(u, c) {
      var d = document, t = 'script',
          o = d.createElement(t),
          s = d.getElementsByTagName(t)[0];
      o.src = u;
      if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); }
      s.parentNode.insertBefore(o, s);
    }
</script>
<!-- anchor-js, Doc:http://bryanbraun.github.io/anchorjs/ -->
<script>
    async("//cdnjs.cloudflare.com/ajax/libs/anchor-js/1.1.1/anchor.min.js",function(){
        anchors.options = {
          visible: 'hover',
          placement: 'right',
          // icon: '#'
        };
        anchors.add().remove('.intro-header h1').remove('.subheading').remove('.sidebar-container h5');
    })
</script>
<style>
    /* place left on bigger screen */
    @media all and (min-width: 800px) {
        .anchorjs-link{
            position: absolute;
            left: -0.75em;
            font-size: 1.1em;
            margin-top : -0.1em;
        }
    }
</style>

<br/>
使用列表:<br/>
<br/>
for循环:<br/>
<ul>
    
</ul>
</body>
</html>

八 模型

8.1 Django ORM

enter description here O:(objects)->类和对象。 R:(Relation)->关系,关系数据库中的表格。 M:(Mapping)->映射。

ORM框架的功能: a) 能够允许我们通过面向对象的方式来操作数据库。 b) 可以根据我们设计的模型类帮我们自动生成数据库中的表格。 c) 通过方便的配置就可以进行数据库的切换。

8.2 数据库配置 mysql命令回顾: 登录mysql数据库:mysql –uroot –p 查看有哪些数据库:show databases; 创建数据库:create database test2 charset=utf8; ==#切记:指定编码== 使用数据库:use test2; 查看数据库中的表:show tables; Django配置使用mysql数据库: 修改settings.py中的DATABASES。

1
2
3
4
5
6
7
8
9
10
11
12
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': 'bj18', # 使用的数据库的名字,数据库必须手动创建
        'USER': 'root', # 链接mysql的用户名
        'PASSWORD': 'mysql', # 用户对应的密码
        'HOST': 'localhost', # 指定mysql数据库所在电脑ip
        'PORT': 3306, # mysql服务的端口号
    }
}

==注意:django框架不会自动帮我们生成mysql数据库,所以我们需要自己去创建。== 8.3 切换mysql数据库之后不能启动服务器

需要安装操作mysql数据库的包,python2环境和python3环境有以下区别。

a) python2需要安装mysql-python:

  pip install mysql-python

b) python3需要安装pymysql:

  pip install pymysql

python3中安装好pymysql,需要在test2/init.py中加如下内容:

1
2
import pymysql
pymysql.install_as_MySQLdb()

8.4 复习案例 1) 设计模型类并生成表 a) 设计BookInfo,增加属性bread和bcomment,另外设置软删除标记属性isDelete。 b) 设计HeroInfo类,增加软删除标记属性isDelete。 软删除标记:删除数据时不做真正的删除,而是把标记数据设置为1表示删除,目的是防止重要的数据丢失。 2) 编写视图函数并配置URL。 3)创建模板文件。 拆解功能: 1) 图书信息展示页。 a) 设计url,通过浏览器访问 http://127.0.0.1:8000/index时显示图书信息页面。 b) 设计url对应的视图函数index。 查询出所有图书的信息,将这些信息传递给模板文件。 c) 编写模板文件index.html。 遍历显示出每一本图书的信息并增加新建和删除超链接。 2)图书信息新增。 a)设计url,通过浏览器访问 http://127.0.0.1:8000/create/时向数据库中新增一条图书信息。 b) 设计url对应得视图函数create。

1
2
3
4
5
6
7
![enter description here](./images/1552264275605.png)
 
页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url地址。 3)图书信息删除。
a)设计url,通过浏览器访问 http://127.0.0.1:8000/delete数字/删除数据库中对应的一条图书数据。
	其中数字是点击的图书的id。
b)设计url对应的视图函数delete。
获取图书的id,进行删除。