四十六、django配置及增删改查

路由访问: 
  如果不加斜杠 会内部自动加上,如果加上还没有会报错(内部会自动重定向)

静态文件配置:
所有的静态文件(css,js,前端第三方类库)默认都放在static文件夹下
STATIC_URL = '/static/'  # static 接口前缀  跟你静态文件夹的名字一点关系都没有
    # 静态文件配置
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),  # static这个是静态文件夹,本地文件名
    os.path.join(BASE_DIR, "static1"),
    os.path.join(BASE_DIR, "static2")
    ]
    ps:会依次查找列表所有的静态文件路径 找到的话立刻停止,都没有找到才会报错返回404
    一般http://127.0.0.1:8080/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js
    xxx表示接口,后面是路径,会依次查找静态配置文件的本地文件夹,去寻找信息
   静态文件接口前缀"动态解析"
        {% 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表单触发提交数据的动作两种方式
<input type="submit">
<button></button>

form 提交数据的地址如何指定及方式
action属性控制提交的地址
 方式:
        1.全路径
             <form action="http://127.0.0.1:8080/login/">
        2.只写路径后缀
             <form action="/login/"> #加上//会自动加上127.0.0.1:8080
        3.不写默认往当前页面提交
form 表单默认是get请求(向服务端获取数据),post(向服务端发送请求)
<form action="" method="post">

根据客户端请求方式不同执行不同的代码逻辑
可以分别执行get和post请求
1.第一种方式:
def login(request):
    # 获取用户端提交的请求方式
    print(request.method) # 默认拿到的请求方式是大写的字符串
    if request.method =="GET":
        return render(request,"login.html")
    elif request.method =="POST":
      return HttpResponse("服务器收到数据了")

2.第二种方式:( 推荐使用)
       if request.method =="POST":
            return HttpResponse("服务器收到数据了")
         return render(request,"login.html")
        # 推荐使用

POST请求(向服务端发送数据):
if request.method == "POST":
        # print(request)    #<WSGIRequest: POST '/login/'>
        print(request.POST)  # <QueryDict: {'username': ['kevin'], 'password': ['123']}>
        print(request.POST.get("username"))  # kevin  values虽然是一个列表但是获取value的时候拿到却是单个元素
        # 默认取最后一个
        print(request.POST.getlist("username"))  # 要想一次性取values里面所有数据需要用getlist
        print(request.POST["password"])  # 123  不推荐使用这种方法
        return HttpResponse("服务器收到数据了")
     return render(request, "login.html")
    获取用户value列表里面所偶遇元素需要用到getlist 应用场景:用户的爱好 多选框
.get只会获取到value列表最后一个数据

GET请求(获取服务端数据):
  print(request.GET)  ## <QueryDict: {'username': ['kevin'], 'password': ['123']}
    # 获取get请求数据和POST方式一模一样
    request.POST.get("username")  取单个
    request.POST.getlist("username") 取多个

 

Django连接数据库
1.需要修改配置文件
        DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "day41",
        "HOST": "127.0.0.1",
        "PORT": 3306,
        "USER": "root",
        "PASSWORD": "123456"
        }
    }
        PS:默认键必须大写

 

2.告诉Django用pymysql替换它默认mysql_db模块连接数据库
方式1.在你的项目文件夹(migrations)下面的__init__.py
方式2.也可以在你的应用名(app01)文件夹下__init__.py

# 固定写法
import pymysql
pymysql.install_as_MySQLdb() # 告诉Django用pymysql代替mysqldb连接数据库

django的orm:
对象关系映射:
类:表
对象:表记录
对象的属性:一条记录某个字段的值
django的orm不能帮你创建库,但是可以帮你创建表
提示:一个django项目使用一个库

数据库迁移命令(********)
python36 manage.py makemigrations (仅仅只是记录,不会创建表)将你的数据库变动记录到小本本上
python36 manage.py migrate 将你的数据变动记录同步到数据库中


django操作数据库增删改查
1.新增数据:
 # 方式一:
 user_obj =models.User.objects.create(name=username,password=password)  # 返回值是当前字段对象
 # 方式二:
 user_obj = models.User(name=username, password=password)
 user_obj.save()  # 对象调用save方法保存数据库
 print(user_obj)
 print(user_obj.pk)  # 获取主键(在不知道主键情况下可以使用)
 print(user_obj.id)  # 获取主键
 print(user_obj.name) # 获取name值
 print(user_obj.password) # 获取password值

2.查询数据:
   print(user_list.query) 可以查看内部执行的sql语句,只要是Queryset对象就可以查询sql语句
   user_list = models.User.objects.all()  查询user表所有sql数据

   利用a标签href属性 可以指定页面跳转的路径 href可以写全路径 但推荐写后缀即可
   <a href="/reg/" class="btn btn-success">添加数据</a>
   # 路径属性一定要加上/ /

    ps:视图函数必须返回一个HttpResponse对象

    重定向 可以写别人的网址也可以写服务端网址
    return redirect("/userlist")  # 内部重定向

 

3.删除数据:
#在跳转标签里把用户id一起发送过来
    <a href="/delete_user/?delete_id={{ user.id }}" class="btn btn-danger ">删除</a>

    删除:
    models.User.objects.filter(id=delete_id).delete()

    queryset对象支持索引取值 但是不推荐你使用 推荐使用自带.first()
    查询方式一:
         models.User.objects.filter(id=delete_id).first()  取出第一个,里面是一个列表对象,如果没有,会返回一个空对象,推荐使用
    查询方式二:
        user_obj = models.User.objects.get(id=edit_id)  # 用get可以直接获取,不推荐 如果没有会报错

 

4.编辑:
编辑对象的id获取方式
方式一:利用input隐藏一个标签
<input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
方式二:直接写在form标签里携带过来,是get请求
<form action="/edit/?edit_id={{user_obj.pk}}" method="post">

更新:
  第一种:
models.User.objects.filter(id=user_id).update(name=user_name,password=password) 推荐使用,执行效率高

第二种:
获取到当前数据对象
user_obj =models.User.objects.filter(id=user_id).first()
user_obj.name = username
user_obj.password = password
user_obj.save()
     不推荐,对对象做了修改之后,所有的数据都要一起变化,效率极低

修改模型层里面的跟表相关的所有数据,只要你修改了就必须重新执行数据迁移命令
python36 manage.py makemigrations 记录到小本本
python36 manage.py migrate 操作数据库建立表字段

图书管理系统设计:
书籍表:书籍与出版社是 一对多

作者: 作者与书籍是 多对多

出版社:出版社与书籍是 多对一

外键字段名 orm会自动会在字段名后面加上_id
无论你的字段名有没有_id ,都会自动加上

django orm中表与表之间建关系
一对多 ForeignKey(to='Publish')

一对一 OneToOneField(to='AuthorDetail')

多对多 ManyToManyField(to='Author')

class User(models.Model):
    # user表的主键字段名就是id
    id = models.AutoField(primary_key=True)
    # varchar(32) name字段是varchar(32), CharField(max_length=32)中max_length必须要加参数
    name = models.CharField(max_length=64)
    # varchar(32) password字段是varchar(16)
    password = models.CharField(max_length=16)

    # addr = models.CharField(max_length=32,default="China")

注意:
前面两个关键字会自动再字段后面加_id
最后一个关键字 并不会产生实际字段 只是告诉django orm自动创建第三张表



posted @ 2019-09-16 17:20  凯帅  阅读(238)  评论(0编辑  收藏  举报