版本:2.1.1
以下笔记记录了把Django三大基础模块运行起来的步骤。
1 创建项目:django-admin startproject myweb
新增应用:python manage.py startapp appname 在当前主目录中新增名为myApp的应用模块
2 myApp目录:1)admin.py:站点配置; 2)models.py:模型; 3)views.py:试图
3 应用生效前需要激活:在setting.py中将myApp应用加入到INSTALLED_APPS中;
4 settings.py文件:修改网页为中文:修改LANGUAGE_CODE = 'zh-hans'
修改网站时区:TIME_ZONE = 'Asia/Shanghai'
修改数据库配置:DATABASES = {
'default':{
'ENGINE' : 'django.db.backends.mysql',
'NAME': 'sunck',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
}
}
5 导入MySQL操作模块:在主项目的__init__.py中:
import pymysql
pymysql.install_as_MySQLdb()
如果使用其他第三方MySQL库,与此类似。如果使用sqlite则不需要导入,因为Django内置了对sqlite的支持。
6 模型:
--->定义模型:一个数据表对应一个模型类。在appname的models.py中定义模型。
--->创建模型:模型类继承于django.db.models.Model。数据列的类型在django.db.models中定义,如CharField(),一般以Filed结尾的对象。如果类成员变量中没有指定主键,那么在生成迁移文件时,会自动加一个自增主键。
--->生成迁移文件:python manage.py makemigrations,在migration目录下生成一个迁移文件,用于描述数据表,但还未生成数据表
--->生成数据表:python manage.py migrate,在数据库中生成数据表。生成的数据表名是'appname_modelclass'格式的,如myapp_grades
--->测试数据操作:可以直接在Python shell中进行测试。
--->执行python manage.py shell,进入shell
--->引入模型包:from myApp.models import Grades,Students
--->引入模型类数据赋值用到的包,如datetime等
--->查询所有数据:Grades.objects.all(),返回Grades对应的myapp_grades表中的所有数据
--->添加数据:
--->创建一个模型类的对象实例,给实例添加和类属性同名的实例属性并赋值
grade = Grades()
grade.gname = '初一'
--->保存数据:grade.save()
说明:Django框架可以把实例属性的值映射到类属性中,从而生成正确的SQL语句。如果没有给实例添加类属性同名的属性,则生成SQL语句时,如果该列不能为空,则会报错。
说明:重写模型类的__str__函数,返回的字符串会在python shell中查询时显示。
--->查询某个数据:grade = Grades.objects.get(pk=1),查询主键(id列)是1的结果,返回的数据会填充Grades对象grade的实例属性
--->修改某个数据:查询出对象后,修改对象的实例属性,再次调用save(),可以进行数据库中的数据内容修改
--->删除某个数据:查询出对象后,调用对象的delete()就可以删除数据库中的数据行,如grade.delete()
--->关联对象:Grades和Students两个表有关联,Students.sgrade列的外键是Grades的主键。测试如下:
--->关联两个对象:student.sgrade = grade;student.save(),数据库中该行数据的外键就是grade对象的主键
--->获取关联的所有对象:grade.students_set.all(),返回所有关联了grade的student对象,关联函数格式:关联模型类名小写_set
--->创建关联的对象:student2 = grade.students_set.create(sname='小明'),参数需要用命名参数的方式,传入关联模型的类属性为名的参数列表,不用传入外键的值,外键的值会自动赋值为grade对象的主键,执行结果是在myapp_students表中添加一行数据,该数据的外键是grade对象的主键。
--->启动服务器进行测试:python manage.py runserver ip:port,如果不写ip和':',就是本地,如果不写端口,就是8000
这是一个python实现的轻量级web服务器,只能在测试中使用
7 admin站点管理应用:即settings.py的INSTALLED_APPS中的'django.contrib.admin'
功能:内容发布:负责添加、修改、删除内容(数据)
创建网站管理员:python manage.py createsuperuser
添加可管理的数据表:在某个应用的admin.py文件中添加,如myApp下:
admin.site.register(Grades)
admin.site.register(Students)
如上可以在管理页面添加对两个数据表的操作
自定义管理页面:默认的管理页面数据不是按行显示,可以自定义显示页面。自定义管理页面需要继续Django的管理页类,然后进行属性修改
--->在admin.py中添加定义自定义管理类:class GradesAdmin(admin.ModelAdmin)
--->修改添加数据表的语句为:admin.site.register(Grades, GradesAdmin)
--->修改列表页属性:数据类型:list
--->list_display = ['pk', 'gname', 'gdate'],显示数据表格头,名称必须和数据表的列名相同,可以只显示部分表头,主键未自定义的可以用'pk'表示
--->list_fliter = ['gname'],在页面添加过滤器,可以过滤字段
--->search_fields = ['gname'],增加一个搜索框,可以按哪些列进行搜索
--->list_per_page = 10,设置每页显示多少条结果
--->修改添加页属性:数据类型:list
--->fields = ['gdate', 'gname', 'ggrilnum', 'gboynum'],配置修改页面中各列的显示顺序,主键不能修改,所以这里不能添加主键列;
--->fieldsets = [('num', {'fields':['ggrilnum', 'gboynum']}),('base', {'fields': ['gname', 'gdate']}),],对修改页的各列进行分组显示,'num'是分组名称,'fields'是
说明:修改页的两个属性不能同时配置
--->关联对象:在添加数据页面,新增关联对象的添加表格,使得在创建一个主数据时,添加多个关联的数据
--->首先申明关联对象类:class StudentsInfo(admin.TabularInline):
关联对象表格TabularInline按行显示,StackedInline按列显示
--->设置属性:model = Students #表示关联类的模型类
extra = 数字 #表示默认添加几条表格
--->然后在管理页GradesAdmin中添加关联对象类属性:inlines = [StudentsInfo]
这样,当添加Grades时,添加页面就会显示关联的Students类的表格
--->修改布尔值(其他值类似):在GradesAdmin中定义一个成员函数,函数返回转换后的值字符串,然后把list_display中对应被转换值的列名改为前面定义的函数名,框架就会调用该函数转换值字符串
--->修改表头名:上一步的转换函数定义好后,为转换函数添加属性:short_description = '新列名',就可以修改对应转换列的名称。这种方法不能用于修改页面和查找过滤的名称替换。
--->修改“执行动作”控件的位置:页面类StudentsAdmin的属性actions_on_top=True,在页面上方显示,actions_on_bottom=True,在页面下方显示,False就是不显示
--->用装饰器替换注册语句:即在页面类定义前加@admin.register(Students)来替换admin.site.register(Students, StudentsAdmin)
8 视图:在Django中,视图对web请求进行回应,MTV中的V,类似于MVC中的C。负责具体的业务逻辑,每个视图和每个页面对应,每个视图就是一个处理函数。
--->在主目录的主项目下的urls.py中添加url地址及对应的响应视图
--->如果子项目响应url地址,步骤如下:
--->在主项目的urlts.py中,urlpatterns中添加正则化的url表达式和对应的子项目urls文件:path(r'', include('myApp.urls')),添加myApp下的urls文件来响应所有的url请求
--->在子项目的views.py中实现视图函数:
def detail(request, *args):
output = 'detail';
for i in range(len(args)):
output += '-%s' % args[i]
return HttpResponse(output)
HTTPResponse是django.http中的类,可以用来返回网页,这里直接返回了一个字符串
--->在子项目的urls.py中,导入视图模块(视图函数),在urlpatterns中添加具体的url正则表达式和对应的视图:url(r'^(\d+)/(\d+)/$', view = detail),用detail函数来处理形如'/数字/数字'的url地址
9 模板:模板是HTML页面,可以根据视图传过来的数据填充控件。模板的创建步骤如下:
--->创建模板目录:在主目录下创建templates目录,在目录下创建对应项目的模板目录,如./mysite/是主目录,./mysite/mysite/是主项目目录,./mysite/myApp/是子项目目录,则模板目录是./mysite/templates/myApp/
--->配置模板目录:在主项目的settings.py中,修改TEMPLATES参数的DIRS属性为:'DIRS': [os.path.join(BASE_DIR,'templates')],
--->定义模板:在项目模板目录中,添加html文件。模板语法:'{{输出值或变量或对象.属性}}','{%执行模板专用语句%}',''中的就是在模板中预留填充的语法。
--->填充模板数据:定义响应的url和视图,在视图函数中给模板填充数据并渲染,把渲染好的页面返回到浏览器。
--->模板中:for/endfor是模板专用语句中的循环语句
<ul>
{%for grade in grades%}
<li>
<a href="{{grade.id}}">{{grade.gname}}</a>
</li>
{%endfor%}
</ul>
模板是未经渲染的html文本,所以可以把'{{}}'放在字符串的引号中,比如上面的超链接
--->views.py中:
def show_grades(request, *args):
gradesList = Grades.objects.all() #获取所有的年级列表
return render(request, 'myApp/grades.html', {'grades': gradesList}); #render函数用来渲染页面,第二个参数是模板路径,配置文件中已经配置了模板目录,这里只需要相对路径,第三个参数就是传递的数据,在html中的变量名是‘grades’,需要用dict传递数据
--->urls.py中: url(r'^grades/(\d+)/$', view = show_students_of_grade),正则url中的括号内匹配到的数据,会当做视图函数的入参,分组顺序传入视图函数
--->在网页中打开localhost:8000/grades就可以看到返回的结果