1 | pip install django |
安装好Django模块之后,python目录下会增加几个文件
1 | Python |
Django项目中会有一些默认的文件和文件夹,需要利用工具去生成
在终端创建
打开终端
进入项目想要存放的目录
执行命令创建
1 | "django-admin.exe的文件地址" startproject 新建项目的名称 |
使用pycharm创建
存在一些问题,需要修改
1 | mysite |
APP是Django项目中的一个独立结构,可以分管不同的功能,开发大型Django项目时,需要创建多个独立APP。
创建APP
1 | python manage.py startapp app01 |
认识项目目录
1 | ├─app01 |
注册APP
1 | 需要在项目的settings.py文件中INSTALLED_APPS变量列表中写入app01.apps.App01Config |
编写url和视图函数的对应关系
1 | 需要在项目的urls.py文件中的urlpatterns变量列表中写入url和视图函数的对应关系(确保views已导入) |
编写视图函数
1 | 将函数写入views.py文件中,注意函数存在默认参数request |
命令行启动
1 | python manage.py runserver |
pycharm启动
Django项目中的HTML模板文件需要放在app目录下的templates目录中,这样才能被函数找到
1 | return render(request, "index.html") |
Django项目中的静态文件(img,css, js, plugins)需要放在app目录下的static目录中
HTML页面引入静态文件时,需要在文件头写上
1 | {% load static %} |
然后在具体引入位置的url中
1 | {% static 'url地址' %} |
模板语法是Django框架提供给python的编程规则,浏览器并不能解析含有模板语法的HTML文件。Django中视图函数的render内部会先读取到含有模板语法的HTML文件,在内部进行渲染(执行模板语法并替换数据),最终得到只含有HTML标签的字符串,再返还给浏览器。本质上是在HTML文件中写一些占位符,由数据对这些占位符进行替换和处理。
1 | n1 = "张三" |
单个变量
1 | <div>{{ n1 }}</div> "张三" |
循环
1 | {% for item in n2 %} |
1 | <ul> |
条件语句
1 | {% if n1 == "张三" %} |
注意:
HTML文件中使用python语句要用到模板,但是模板语法跟正常python语法有一些不同, 比如:
不能出现()
,模板语法会自动添加
时间转换,datetime类型的时间转换为字符串:t1|date:"Y-m-d H:i:s"
request是一个对象,封装了用户发送的所有请求相关数据
1 | print(request.method) # 获取请求方式 |
1 | return HttpResponse("返回内容") # HttpResponse方式返还给请求者一个字符串 |
Django框架对于获取请求体传递的值时,有一层保护机制
在HTML文件的表单中添加
{% csrf_token %}
可以解决
python代码通过数据库相关的模块(如pymysql)可以操作数据库,但是在Django框架中显得繁琐,Django框架内部提供了操作数据库的框架:ORM框架。
ORM的作用相当于在python代码和数据库相关的模块(mysqlclient等)之间桥梁,或是充当翻译,可以使沟通更加便捷,从而使代码编写更简单。
ORM可以做两件事:
创建、修改、删除数据库中的表。[不能创建数据库]
操作表中的数据
所以使用ORM时,必须要有提前创建好的数据库。
安装数据库模块
1 | pip install mysqlclient |
Django连接MySQL
在settings.py文件中配置和修改
1 | DATABASES ={ |
首先,需要在models.py文件中进行操作
其次,需要在终端执行更新命令
1 | python manage.py makemigrations |
1 | class UserInfo(models.Model): |
删除表和删除字段时,在models.py文件中把类给注释掉,然后执行终端执行两行命令就可以
添加字段时,要考虑到新增字段的数据问题
- 可以选择默认值
age = models.IntegerField(default=18)
- 可以允许为空
age = models.IntegerField(null=True, blank=True)
否则在终端输入命令时,会让再次选择手动输入默认值或者退出
数据库中的两张表有关联,比如已经存在的用户表userinfo
,包含id
,用户名
,密码
,年龄
四个字段。
另要新建一张关注表,要求其中一个字段关注人
,必须是用户表中的用户,可以与用户表的id
相关联
1 | concern_er=models.ForeignKey(to='userinfo', to_filed='id', on_delete=models.CASCADE) |
也可以不采用级联删除的方式,若用户被删除,则与其相关的这条字段置空
1 | concern_er=models.ForeignKey(to='userinfo', to_filed='id',null=True,blank=True, on_delete=models.SET_NULL) |
注意:在函数中操作表中数据时,需要先导入类
新增数据
1 | 表名.objects.create(字段名=值,字段名=值,字段名=值) |
1 | # 比如: |
删除数据
1 | 表名.objects.filter(条件).delete() # 删除指定数据,条件一般是id |
1 | # 比如: |
查询数据
1 | data_list = 表名.objects.filter(条件) |
1 | # data_list里面封装的对象可以通过循环获得,比如: |
排序
1 | 表名.objects.all().order_by("字段名") # 正向排序,从小到大 |
修改数据
1 | 表名.objects.all().update(字段名=值) |
1 | # 比如 |
定义母版
1 | <!--母版的文件名:xx.html--> |
继承母版
1 | {% extend 'xx.html' %} |