一起学Django

有Python基础的同学, 可以尝试着进阶使用Python了

比如使用Python进行爬虫、数据可视化分析(Numpy, Pandas等),还有可以快速开发后台应用等等等

这里我就示例:使用Django快速开发后台应用

操作系统:Mac OSX 10.13.3

开发工具:VSCode (当然了, 你也可以使用Atom或者其他的都行)

开发语言:Python3.6+

Let’s start!

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
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
1. pip3 install django

2. pip3 install pymysql (这里可以暂时不做, django默认使用自带的sqlite数据库)

3. 初始化项目
Django-admin startproject hellodjango

4. cd hellojango

5. 创建一个模块
Python3 manager.py startapp firstapp

6. 添加firstapp到settings的app中, 因为settings.py里面有很多系统的apps。 为这些apps创建数据库。
Python3 manager.py migrate

7. 这时候就可以进行本地启动下。
先添加firstapp到settings.py中apps中。
Python3 manager.py runserver

8. 在models.py中定义model
class People(models.Model):
name = models.CharField(null=True, blank=True, max_length=200)
job = models.CharField(null=True, blank=True, max_length=200)

9. 合并数据库,将改动作用于数据库文件。
python3 manage.py makemigrations

10. 创建数据库
python3 manage.py migrate 创建数据库

11. 创建一个超级管理员
python3 manage.py createsuperuser
查看django自带的后台
localhost:8000/admin

12. 在admin.py文件中,将models注册到站点的后台上,才会在后台管理界面可以查看
from django.contrib import admin
from firstapp.models import People
# Register your models here.
# 会显示在后台管理界面中
admin.site.register(People)
在admin后台中真正添加数据表

13. 模板目录的配置
在settings.py中
# 自定义 指定模板的位置
'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\', '/')],

14. static静态文件的在模板html中使用
{% load staticfiles %}
<link href="{% staticfiles 'css/semantic.css' %}">
原因是因为在settings.py中默认就是这样配置static静态文件
STATIC_URL = '/static/'

15. 在urls.py中配置views.py中的资源访问路径
from django.contrib import admin
from django.urls import path
from firstapp.views import first_try, index

urlpatterns = [
path('admin/', admin.site.urls),
path('first_try/', first_try),
path('index', index, name='index')
]

关于项目默认使用的数据库sqlite

Mac系统中自带sqlite工具

1
2
3
4
5
6
7
django默认使用sqlite数据库, 当然了你可以在settings.py里面配置其他的数据库。
在iterm中可以使用sqlite3 db.sqlite查看数据库
简单使用sqlite3数据库命令
.database
.table
select * from firstapp_student
.schema firstapp_student

设置项目后台管理语言

1
2
3
修改后台管理语言为 中文
在setting.py文件中修改如下:
LANGUAGE_CODE = 'zh-hans'

自定义后台管理界面

1
2
3
4
5
6
7
8
9
查找django的安装目录
python3
import sys
sys.path
找到ite-packages目录。 找到django中admin的后台管理界面cp到自己项目目录中。 修改标题后即可自定义自己的后台管理名称等。
我的是:/usr/local/lib/python3.6/site-packages/django/contrib/admin/templates/
1. 在根目录下创建templates/admin文件夹
2. 然后将base_site.html模板移动到该admin目录下。
3. 修改base_site.html文件的title为自己后台名称, 重启下应用即可。

django后台shell(进行一些增删改查)

1
2
3
4
5
python3 manage.py shell
import django
django.setup()
from firstapp.models import Student
Student.obejcts.all()

django中的models介绍

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
class People(models.Model):
name = models.CharField(null=True, blank=True, max_length=200)
job = models.CharField(null=True, blank=True, max_length=200)

字段类型有:
CharField,TextField,IntegerField, DateTimeField,BooleanField等等。

字段参数修饰:
null=True, 默认为Flase, True若当前字段为空值, 则保存成null
blank=True, 默认为False, 设置该字段可以为空值。
max_length=200, 最大长度
default='默认值', 指定默认值
choices =元组或者列表
help_text 只对生成文档时有效
primary_key 如果设置成True, 则该字段就成为表中主键,除非你自己设置一个主键, 否则在django中默认为每张表设置一个IntegerField的主键。

数据库中关系:
models.ForeignKey(Student, verbose_name='the related student')
models.ManyToManyField(Site, verbose_name='list of sites)
models.OneToOneField(Place, verbose_name='related place')


Student.objects.all() 查询所有
Student.objects.filter(name='dottie') 查询指定条件的result
Student.objects.exclude(name='dottie') 查询指定条件外的result
常用的就是这三个。
可以链式调用
Student.objects.filter(name='dottie').exclude(age='18').filter(nickname='hh')等等

通过get获取单一对象
Student.get(pk=2) 或者id=2 也可以

也可以通过pk__in([1, 4, 5])
查询主键为1, 4, 7的result集

或者查询主键大于10
pk__gt(10)

限制查询集(使用切片) Student.objects.all()[:5]
排序并找到最大: Student.object.order_by('age')[0]

exact
Student.get(name_exact='dottie')
等价于: select * from Student where name = 'dottie'
忽略大小写 则用 name_iexact

contains
Student.get(name_contains='dot')
等价于: select * from Student where name like '%dot%'
大小写不敏感用icontains
类似的还有startswith endswith


删除一个对象
stu = Student.objects.get(pk = 1)
stu.delete() 即可

保存一个对象
stu = Student(name='dottie', age = 24)
stu.save()

修改一个对象
stu = Student.objects.get(pk = 1)
stu.update(name='daejong')

例子:
from django.db import models
# Create your models here.
class Teacher(models.Model):
name = models.CharField('名字', max_length=128)
age = models.IntegerField('年龄', default=22)
salary = models.FloatField('薪水', null=True, blank=True)
position = models.CharField('职位', max_length=128)
birth = models.DateTimeField('出生日期')

def __str__(self):
return self.name

class Student(models.Model):
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
name = models.CharField('名字', max_length=128)
age = models.IntegerField('年龄', default=18)
birth = models.DateTimeField('出生日期')
hobby = models.TextField('兴趣')

def __str__(self):
return self.name

urls使用

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
1. 可以在全局的urls.py中定义自己的url(不提倡这中做法, 应用一旦多起来,urls也多了,就不好管理url了)
from django.contrib import admin
from django.urls import path
from firstapp.views import first_try, index

urlpatterns = [
path('admin/', admin.site.urls),
path('first_try/', first_try),
path('index', index, name='index')
]

2. 不过一般的做法都是在每个应用(或者说是模块)下, 自己定义一个urls.py
from django.contrib import admin
from django.urls import path
from app1.views import index

urlpatterns = [
path('index/', index, name = 'index'),
]

然后在全局的urls.py中调用每个应用的urls, 这样即便应用很多,也不会乱。
from django.contrib import admin
from django.urls import path, include
from app1 import urls

urlpatterns = [
path('admin/', admin.site.urls),
path('app1/', include(urls))
]