image.png

一.创建项目&创建应用&配置文件

1.创建项目

  1. 常用命令:django-admin startproject mysite

2.创建应用

  1. 常用命令:django-admin startapp appnamepython manage.py startapp appname

3.配置文件

3.1面向整个项目的配置文件

  • settings.py

包含了项目的初始化设置,可以针对整个项目进行有关参数配置,比如配置数据库、添加应用
常用配置:

  1. DEBUG:设置为True能够显示详细调试报错信息,设置为False可避免暴露项目的相关信息
  2. ALLOWED HOSTS:可设置允许访问ip,格式为ALLOWED HOSTS = ['127.0.0.1'],设置为"*",所有的ip都能访问,但是不安全
  3. INSTALLED_APPS:新增加的应用需要配置到这里才能激活

image.png

  1. DATABASES:配置数据库,默认配置的是SQLlite
  • urls.py

主要是把URL映射到应用程序上,可以是某个应用中的urls.py文件(include函数),也可以是某个具体的函数视图
3.2 创建项目的默认文件

  • admin.py

django自定义管理工具,比如设置管理界面项目,或者自定义与系统管理有关的类对象,向管理功能增加新的内容

  • apps.py

应用的配置文件,例如设置一个应用名称

  • migrations

用于存储应用的数据库表结构,实现在models.py模型类和数据库表之间迁移

  • models.py

应用的数据模型,可以为空,但是不能删除

  • tests.py

可以用来编写测试文档来测试所建立的应用

  • views.py

用于用户保存响应各种请求的函数或类,称之为基于类的视图或者基于函数的视图

二.Django的MTV模式

1.什么是MTV?

django的模型(Mdoel)、模板(Template)、视图(Views)称之为MTV模式
M:Model,数据存取层,负责处理与数据相关,如读取、写入数据等
T;Template,表现层,处理与表现相关的事件,例如在页面中显示相关内容
V:Views,业务逻辑层,是模型(M)和T(模板)之间的桥梁

三.数据模型

1.数据模型的字段和字段属性

在models.py中写的类,都会与数据库中的表都具有对应关系,类中定义的属性,也将对应着数据表中的一个字段
image.png
image.png
常用字段属性

  1. autoField:一个根据实际ID自动增长的IntegerField,通常不指定,
  2. 如果不指定,一个主键字段将自动添加到模型中
  3. CharField(max_length=字符长度):字符串,默认的表彰样式是TextInput
  4. TextField:大文本字段,一般超过4000时使用,默认的表单控件是Textarea
  5. DateField([auto_now=False, auto_now_add=False]):
  6. 使用Pythondatetime.date实例表示的日期
  7. 参数说明:
  8. DateField.auto_now
  9. 每次保存对象时,自动设置该字段为当前时间,用于“最后一次修改”
  10. 的时间戳,它总是使用当前日期,默认为 False
  11. DateField.auto_now_add
  12. 当前对象第一次被创建时自动设置当前时间,用于创建的时间戳,
  13. 它总是使用当前日期,默认为 False
  14. 说明
  15. 该字段默认对应的表单控件是一个TextInput.在管理员站点添加了一个
  16. JavaScript写的日历控件,和一个“Today”的快捷按钮,包含了一个额外
  17. invalid_date错误消息键
  18. 注意
  19. auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间
  20. 的任何组合将会发生错误的结果
  21. TimeField:使用Pythondatetime.time实例表示的时间,参数同DateField
  22. DateTimeField:使用Pythondatetimedatetime实例表示的日期和时间,参数同DateField
  23. FileField:上传文件的字段

2.数据迁移

数据模型编写好了,开始根据数据模型建立数据库表,在根目录(manage.py文件所在目录)执行命令:python manage.py makemigrations,这时候会生成一个迁移文件
image.png
现在开始真正的创建数据表,执行命令:python manage.py migrate,数据库表则创建成功
创建超级管理员,执行命令:python manage.py createsuperuser

3.数据模型对应数据库的属性

3.1 主键
作用:保证数据库表中记录的唯一性
方法:在某一字段的属性参数中声明primary_key = True,一个数据模型类只能有一个主键

3.2 唯一性
作用:确定某个字段的值不能重复
方法:在某一字段的属性参数中声明unique = True
3.3 Meta
在模型中定义Meta类,用于设置元数据,指的是就是除了字段外的所有内容,例如排序方式、数据库表名等
最常用的:ordering、unique_together
ordering = [‘XX’] 按XX升序排序
ordering = [‘-XX’] 按XX降序排序
unique_together:等同于数据库的联合约束,保证数据库不能存重复的信息
image.png
3.4 对应关系
一对一:OneToOneField:一对一,将字段定义在任意一端中
一对多:ForeignKey:一对多,将字段定义在多的端中
多对多:ManyToManyField:多对多,将字段定义在两端中

四.视图

1.web表单的请求过程

1).用户通过客户端第一次向服务器发送表单页面请求,django会创建一个未绑定数据的表单实例(form = LoginForm(),form实例就是未绑定实例),等待用户填写内容
2).用户提交了表单,将内容提交到服务器,在django的视图中接受数据
(form = LoginForm(request.POST)),然后进行表单基本验证
3).通过表单验证,则可以进行下一步操作,例如保存数据、返回信息、url跳转等
4).没有通过表单验证,返回表单实例并带报错信息,返回到前端页面
image.png

2.Form和ModelForm

django的表单系统,主要分两种

  • 基于django.forms.Form
  • 基于django.forms.ModelForm

2.1 forms.Form:
一般用于不怎么与模型交互的表单
2.2 forms.ModelForm:
创建的表单将被自动创建,然后可以稍后由您调整,例如一个有User模型,现在还想创建一个form表单来增加手机号和生日这两个信息到这个模型中,这时候我们就可以使用forms.ModelForm
image.png
image.png

  1. model = UserProfile # 对应的Model中的类
  2. fields = ("phone", "birth") # 为你要在表单中使用的字段列表
  3. UserProfile类中定义了 user 宇段 OneToOneField()的含义是通过 user 这个字段为纽带
  4. 声明

2.3 ModelForm中的save()方法:是将表单数据保存到数据库,并生成该数据对象,在参数里多了 commit=False 其结果是数据并没有被保存到数据库,而仅生成了一个数据对象,
设置了该数据对象的密码(这个密码是经过校验的),这个操作得益于前面 commit=False 的设 ,如果没有此参数,数据被写到数据库中了,再设置密码就需要重新写入,这样就不用写入两次数据库了
image.png

3.HttpRequest对象

  1. 客户端向服务器发送请求,django会在包含请求数据中创建一个HttpReequest对象,
  2. 并以参数request传给视图函数,所以request所引用的对象就是HttpRequest对象,
  3. 该对象常用属性
  4. path:返回一个字符串,表示请求页面的路径 例如“/blog/admin/”
  5. GET:返回类字典对象,包含所有的http GET参数
  6. POST:返回类字典对象,包含所有的http POST参数
  7. REQUEST:返回类字典对象,包括所有POSTGET数据(一般不用,直接用getpost

4.HttpResponse对象

  1. HttpResponse对象
  2. 概述:
  3. 作用:给浏览器返回数据
  4. HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建
  5. 用法:
  6. context = {'bb' : bb}
  7. return_string = 'OK'
  8. def titlerequest):
  9. ...
  10. return HttpResponsereturn_string
  11. return render(request,"XX/aa.html", context)
  12. return redirect("http://www.google.com")
  13. HttpResponse():返回,并将作为参数的字符串发给浏览器
  14. 使用render():
  15. 原型:render(request, templateName[, context])
  16. 作用:结合数据和模板,返回一个完整的HTML页面
  17. 参数:
  18. request:请求体对象
  19. templateName:模板路径
  20. context:传递给需要渲染在模板上的数据
  21. redirect():
  22. 让浏览器跳转去指定的URl

五.模板和静态文件

1.自定义模板

编辑文件settings.py ,修改TEMPLATES的值,BASE_DIR表示是在本项目的根目录,用函数os.path.join()连接两者,所以自定义模板的位置就是根目录的templates(./templates),APP_DIRS设置为False,则django不再按照原来的默认方式寻找模板文件
image.png

2.静态文件的配置

在settings.py增加如下代码,指定了静态文件是存放目录,是在相对项目根目录的static子目录中创建./static目录
image.png

3.前端模板常用语法

  1. block标签:在父模板中预留区域 ,子模板去填充
  2. 语法 {% block 标签名 %}
  3. {% endblock 标签名 %}
  4. extends标签:继承模板,需要写在模板文件的第一行
  5. 语法 {% extends 'myApp/base.html' %}
  6. {% block main %}
  7. 内容
  8. {% endblock 标签名 %}
  9. CSRF:
  10. 跨站请求伪造
  11. 某些恶意网站包含链接,表单,按钮,js,利用登录用户在浏览器中认证,从而攻击服务
  12. 防止CSRF
  13. settings.py文件的MIDDLEWARE增加'django.middleware.csrf.CsrfViewMiddleware'
  14. {% csrf_token %}

六.URL的配置

1.URL和视图函数的映射关系

url模板相当于是整个项目的地图,django会根据URL模板响应用户的URL地址,找到对应的视图和函数,然后函数在通过调用模型(models)获取数据,再通过模板(Templates)产出html页面,最后通过url模板逆向返回给用户html文件

2.url模板格式:

  1. urlpatterns = [
  2. url(正则表达式,view函数,参数,别名)
  3. ]
  4. 参数说明:
  5. # 一个正则表达式字符串
  6. # 一个可调用对象,通常为一个视图函数
  7. # 可选的要传递给视图函数的默认参数(字典形式)
  8. # 一个可选的name参数
  9. urlpatterns = [
  10. # 主页
  11. url(r'^$', views.index, name='index'),
  12. # 显示特定主题的页面
  13. url(r'^topics/$', veiws.topics, name = 'topics'),
  14. # 显示
  15. url(r'^topics/(?P<topic_id>)\d+/$', views.topic, name = 'new_topic'),
  16. ]
  17. python的正则表达式中,分组的语法:(?P<name>pattern),
  18. name表示分组名,pattern表示一些匹配正则
  19. 别名:可在模板(Template)中,使用别名代替这个URL
  20. 常用正则表达:
  21. ^:指定起始字符或字符串
  22. $:指定终止字符
  23. /:对应原来的字符
  24. \d:任何一个数字字符
  25. \D:非数字的字符
  26. \w:任何一个字符[a-zA-Z0-9]
  27. \W:非任何一个字符[^a-zA-Z0-9]
  28. ?:代表前面一个字符样式可以重复出现0次或1
  29. *:可以重复出现0次或0次以上
  30. +:可以重复出现1次或1次以上

七.前后端参数传递

1.view->HTML

  1. return_string = 'OK'
  2. def titlerequest):
  3. ...
  4. return HttpResponsereturn_string

2.1 HTML->view

  1. from django.shortcuts import render
  2. def main_page(request):
  3. data = [1,2,3,4]
  4. return render(request, 'index.html', {'data': data})

2.2 Templates href格式

  1. <td>
  2. <a name="edit" href="{% url 'article:update_article' article.id %}"> # 带参数的url
  3. <span class="glyphicon glyphicon-pencil"></span>
  4. </a>
  5. <a name="delete" href="javascript:" onclick="del_article(this,{{article.id}})">
  6. <span class="glyphicon glyphicon-trash" style="margin-left:20px;"></span>
  7. </a>
  8. </td>
  9. django中的超链接,在template中可以用{% url 'app_name:url_name' param%}
  10. 其中app_name在工程urls中配置的namespace取值,
  11. url_name是在tweb/urls.py中配置的name对应
  12. 启用的param参数为可选项,当函数存在的时候带上参数对应的取值

主urls.py
image.png
app的urls.py
image.png
tempaltes页面
image.png

3.其他传递方式

  • javascript方式