• 四十六、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自动创建第三张表



  • 相关阅读:
    hdfs 复制路径下所有文件
    吐槽scala
    scala
    spark 你要喧宾夺主么?好好干。
    信赖域算法
    scala shuffle
    自动梯度求解 反向传播算法的另外一种视角
    spark 2.0 Vector toBreeze
    自己玩的git
    js判断浏览器
  • 原文地址:https://www.cnblogs.com/wukai66/p/11528443.html
Copyright © 2020-2023  润新知