前言:本博客为技术小白的记录学习过程,有错误或不解的地方请指出 !!!
一.安装和创建项目
1.安装
1.1 命令行下载
pip3 install django==1.11.11 (可以跟镜像地址: -i +镜像地址 )
1.2 测试安装是否成功
django-admin
1.3注意事项:
- 计算机名称不能含中文
- 项目名称和py文件最好也不要使用中文
- django的版本:目前django最新版本为4.X, 本次学习选择1.11.11版.
2.创建django项目
2.1 命令行模式
a.创建django项目
django-admin startproject + 项目名称
b.启动django项目
cd 项目名
python3 manage.py runserver
如果python是3.6以后的版本,可能会报错,这是需要修改py文件源码
python安装目录下的lib\site-packages\django\contrib\admin\widgets.py去掉152行后面的逗号.
'%s=%s' % (k, v) for k, v in params.items(),
c.创建app
python manage.py startapp + app的名字
2.2 pycharm 模式
新建项目>>>选择Django >>>选择先前配置的解释器>>>填写app名>>>点击创建
2.3 注意事项
django项目创建完成后, 先验证项目是否可以正常启动, 如果报下面这个错误:
TypeError: unsupported operand type(s) for /: 'str' and 'str'
需要修改配置文件
2.4 django目录结构说明
djangoProject文件夹 #项目同名文件夹
settings.py # django暴露给用户可以配置的配置文件
urls.py #路由与视图函数(可以是函数也可是类)对应关系
wsgi.py #忽略
app01文件夹 #应用(可以有多个)
migrations文件夹 #存储数据库记录相关(类似于操作日志)
admin. py # django后台管理
apps.py # 注册app
db.sqlite3 # django自带的小型数据库
manage.py # django入口文件
templates #模板文件(存储html文件)
3.修改django默认端口
django默认的端口号是8000,在同一台机器同一时间如果需要运行多个django项目,需要修改端口号
python3 manage.py run server ip:port
pycharm自主修改
二.项目开发
1. 小白必会三板斧
1.1 HttpResponse
返回字符串
from django.shortcuts import render, HttpResponse, redirect
def func(request):
return HttpResponse('你好啊!')
1.2 rende
返回html页面, 还可以使用末班语法
from django.shortcuts import render, HttpResponse, redirect
def func(request):
lst = [{'username': 'root', 'pwd': '123456'}, {'username': 'admin', 'pwd': '123456'}]
return render(request, 'userinfo.html', {'userinfo_list': lst})
1.3 redirect
重定向
from django.shortcuts import render, HttpResponse, redirect
def func(request):
return redirect('http://www.baidu.com')
2. 静态页面配置
2.1 静态文件
写好之后不会自动动态改变的文件资源, 比如写好的css文件、js文件、图片文件、第三方框架文件。在django项目目录下创建static文件件,默认将所有的静态文件都放在static文件夹中。
2.2 配置
在settings.py文件中,设置静态文件的路径:
STATIC_URL = '/static/' # 接口前缀
'''
想要访问静态文件资源,必须以static开头;
<script src="/static/js/content.js"></script>
只要书写了接口前缀,就拥有访问STATICFILES_DIRS列表中
所有文件夹内部资料的权限
'''
# 静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'static1'),
os.path.join(BASE_DIR, 'static2'),
]
3. request对象方法
- request.method:获取当前请求的请求方法并且结果是一个纯大写的字符串;
'''
视图函数书写格式
def login(request):
if request.method == 'POST':
return HttpResponse('你是不是傻!')
return render(request, 'login.html')
'''
- request.POST:获取用户提交post请求过来的基本数据(不含文件),直接看成是字典即可;
- request.POST.get(): 获取列表最后一个元素;
- request.POST.getlist(): 获取整个列表;
- request.GET:获取url问号后面的数据,直接看成是字典即可;
- request.GET.get(): 获取列表最后一个元素;
- request.GET.getlist(): 获取整个列表;
- request.FILES: 获取用户上传的文件数据
- # form表单如果需要携带文件数据,需要添加参数
<form action='' method='post' enctype='multipart/form-data'>
- request.FILES.get(): 获取列表最后一个元素;
- request.FILES.getlist(): 获取整个列表;
4.django连接数据库
django默认使用自带的sqlite3,sqlite3不太好用,因此我们使用pymysql模块进行操作数据
4.1 配置文件修改配置
5.django orm模块的使用(非常重要)
5.1django orm简介
orm:orm中文名对象关系映射,映射关系入下:
类 -------> 表
对象 -------> 表里面的数据
对象.属性 -------> 表里面字段对应的值
# 缺点:sql封装死了,有时候查询速度较慢
5.2 orm的使用
a . 模型类需要写在应用的models.py文件中
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32) # CharField必须要加max_length
# age int
age = models.IntegerField()
b. 数据库迁移命令(必须记住)
- python3 manage.py makemigrations:将数据库修改操作记录到migrations文件夹
- 如果执行命令没反应,就执行python manage.py makemigrations
- python3 manage.py migrate: 真正的执行数据迁移操作
- # 只要修改了models.py 中跟数据库相关的代码就必须重新执行上述两条命令。
- 快捷方式:点击工具-->点击运行manage.py,然后只需要在终端中输入关键字makemigrations、migrate。
c. 针对主键字段
- 如果不指定主键,那么orm会自动创建名为id的主键字段;
- 如果想自定义主键名,则需要手动自定。
d.字段的增删改
- 增加字段:在User类中填写需要增加字段的代码即可,然后执行数据库迁移命令。
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32) # CharField必须要加max_length
# 增加字段age int
age = models.IntegerField(verbose_name='密码', null=Ture) # verbose_name起别名
# 增加字段时,需要设置默认值null=Ture或者default=1。
- 删除字段:注释掉对应字段的代码,然后执行数据库迁移命令。
- 修改字段:修改对应字段的代码,然后执行数据库迁移命令。
e.数据的增删改查
- 查询数据:在对应的模块导入models模块,然后通过filter方法进行查询
from app improt models
def func():
user.obj = models.User.objects.filter(name='xxx').frist()
# models.User.objects.filter(name='xxx')相当于select * from user where name='xxx'
# models.User.objects.filter(name='xxx')的结果是[对象],可以通过索引和frist方法拿到列表中对象。
# 查询所有数据
models.User.objects.all() # [obj1,obj2,obj3,......]
相当于select * from user
- 添加数据
from app improt models
def func():
user.obj = models.User.objects.create(name='xxx',pwd='abc')
# models.User.objects.create(name='xxx',pwd='abc')相当于insert into user(name,pwd) values('xxx','abc')
- 修改数据
from app improt models
def func():
# 第一种修改方式:
models.User.objects.filter(id='xxx')update(name='yyy',pwd='123')
# 第二种修改方式:
edit_dit = models.User.objects.filter(id='xxx').frist()
edit_dit.name = 'yyy'
edit_dit.pwd = '123'
- 删除数据
models.User.objects.filter(id='xxx').delete()