初识django的大致流程
初识django的大致流程
静态文件配置
再写django项目的时候,可能会出现后端代码修改,但是前端页面没有变化的情况,两种解决办法
- 同一个端口开了好几个django项目,其实跑的是第一个django项目,关闭以前的
- 浏览器缓存问题 settings-> network-> disable cache
如果你想访问静态文件,你必须static开头
/static/ 就像是一个令牌,是带你找到静态文件的药匙,你需要在settings里面配置静态文件
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
如果药匙的令牌变了,那就要一改全改,那该咋办呢,这里可以利用静态文件动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css'%}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
这里配置完成之后,form表单默认的是get请求数据,在我们输入提交账号和密码的时候,在login后面的参数会出现我们的信息
form表单action参数有三种情况
- 不写,默认的是当前所在的url提交数据
- 全写,指名道姓
- 只写后缀/login/
这里我们就算是对静态文件基本配置完成,但是当我们访问的时候还是会出现问题,那就是csrf问题,这个是经常间的,有两种解决办法
- django提交post请求的时候 需要取配置文件中注释掉一行代码
request对象方法的初识
request.method # 返回请求方式,全大写的字符串形式
request.POST # 获取用户post请求提交的普通数据不包含文件
request.POST.get() # 只获取列表最后一个元素
request.POST.getlist() # 直接将列表取出
request.GET() # 获取用户提交的get请求数据应
request.GET.get() # 只获取列表中的最后一个元素
request.GET.getlist() # 直接将列表取出
get请求携带的数据是有大小限制的,post 请求没有限制
def login(request):
if request.method == 'POST':
return HttpResponse('这是post请求')
return render(request,'login.html')
pycharm连接数据库
三个位置查找数据库相关, 右侧上方database, 左下方database, 配置里面的plugins插件搜索安装, 再没有卸载pycharm重新装, pycharm可以充当很多款数据库软件的客户端
django 连接数据库
dajngo默认的是sqlkite3
这里我们可以修改默认设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
1.第一步配置文件中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day60',
'USER':'root',
'PASSWORD':'admin123',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
}
2.代码声明
django默认用的是mysqldb模块链接MySQL
但是该模块的兼容性不好 需要手动改为用pymysql链接
你需要告诉django不要用默认的mysqldb还是用pymysql
# 在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以
import pymysql
pymysql.install_as_MySQLdb()
django orm介绍
orm 对象映射关系
类 | 表 |
---|---|
对象 | 记录 |
对象属性 | 记录某个字段对应的值 |
详情步骤
第一步: 先去models.py 中书写一个类
class User(models.MOdel):
id = models.AutoField(primary_key=True)
# id int primary_key auto_increment
username = models.CharField(max_length=32)
password = models.IntegerField()
第二步: 数据库迁移命令
python3 manage.py makemigrations
python3 manage.py migrate
只要你修改了models想相关的代码,就必须重新执行上述的两条命令
注意: CharField
必须要指定max_length参数,不指定报错
verbose_name
是所有字段都有的,是对字段的解释
由于一张表中必须要有一个主字段,这个叫id字段,在orm里面你不定义id字段的时候,orm会自动帮你创建id字段,在后面我们创建模型表的时候,主字段可以省略不写
orm实现数据库的增删改查
字段的增删改查
1 . 可以在终端内直接给出默认值
2 . 该字段可以为空
info = models.CharField(max_length=32, verbose_name='个人简介', null= True)
3 . 直接给字段设置默认值
hobby = models.CharField(max_length=32, verbose_name='兴趣爱好',default='study')
字段的修改
直接修改代码,执行数据库迁移命令
字段的删除
直接注释掉即可(在操作models.py 的时候一定要细心。在迁移之前检查一下代码),执行完毕之后字段对应的数据也都没有
数据库的增删改查
查:
res=models.User.objects.filter(username=username)
# 返回值你先看成是列表套数据对象的格式,不推荐你使用索引的方式取值
user_obj = models.User.objects.filter(username=username).first()
filter内可以有多个参数
增
第一种
返回值就是被创建的对象本身
from app01 import models
res = models.User.objects.create(username=username,password=password)
第二种
对象的实例化模式
user_obj = models.User(username=username,password=passowrd)
user_obj.save()
查 ,改,删和统一的案例
第一步:
展示数据
def userlist(request):
user_query = models.User.objects.all()
return render(request, 'userlist.html', locals())
# 这里我们要想一个问题如何告诉后端我们想要编辑的是哪一条数据呢?
# 我们可以在编辑按钮url后面添加代餐是的方式,获取想要编辑的数据id值
页面展示数据 userlist.html
<h1 class="text-center">数据展示</h1>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
<th>action</th>
</tr>
</thead>
<tbody>
{% for user_obj in user_query %}
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.username }}</td>
<td>{{ user_obj.password }}</td>
<td>
<a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
<a href="/delete_user/?user_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
第二步:
第二步:
# 编辑数据
def edit_user(request):
# 先获取url问号后面的参数
edit_id = request.GET.get('user_id')
# 查询当前用户想要编辑的数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 修改数据方式一
models.User.objects.filter(id=edit_id).update
(username=username,password=password)
# 修改数据方式二
edit_obj.username = username
edit_obj.password= password
edit_obj.save()
# 跳转到数据展示页面
return redirect('/userlist/')
# 将数据对象展示到页面上
return render(request,'edit_user.html',locals())
编辑页面 edit_user.html
<h1 class="text-center"> 编辑</h1>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<form action="" method="post">
<p>username:
<input type="text" name="username" class="form-control" value="{{ edit_obj.username }}">
</p>
<p>username:
<input type="text" name="password" class="form-control" value="{{ edit_obj.password }}">
</p>
<input type="submit" class="btn btn-info btn-block" value="编辑">
</form>
</div>
</div>
</div>
第三步:
def delete_user(request):
# 获取用户想要删除的数据id值
delete_id = request.GET.get('user_id')
# 直接去数据库中删除对应的数据即可
models.User.objects.filter(id=delete_id).delete()
return redirect('/userlist')
django ORM创建表关系
图书和出版社是一对多的关系 外键字段建在多的那一方 book
图书和作者是多对多的关系 需要创建第三张表来专门存储
作者与作者详情表是一对一
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
publish = models.ForeignKey(to='Publish')
"""
图书和出版社是一对多的关系,关系建立在双方均可,建议建在查询频率比较高的一方
定义ForeignKey的时候orm自动在字段后面加_id
"""
author_book = models.ManyToManyField(to='Author')
"""
图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
author_book是一个虚拟字段,orm自动帮你创建第三张表关系
"""
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDetail')
"""
作者和作者详情是一对一关系,外键字段在任意一方
"""
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
# 在django1.X版本中外键默认都是级联更新删除的
# 多对多的表关系可以有好几种创建方式