zoukankan      html  css  js  c++  java
  • Django完成常用四大功能

    返回主目录:Django框架

    内容目录:

    1.pycharm连接数据库及相应操作

    2.手撸登录注册编辑删除

    3.完整代码

    一、pycharm连接数据库及相应操作

    此处附上链接地址:https://www.cnblogs.com/xt12321/p/10992542.html

    二、手撸登录注册编辑删除

    2.1 登录、注册
    (1)登录
    
    1> 先在urls.py里面添加路由设置
    2> 再在视图层 view.py里面定义login的处理逻辑
    3> 在templates文件夹里面,添加上login.html文件
    
    这样三步下来之后,便可以在本机上访问本地的登录界面
    
    urls.py文件 --> urlpatterns中添加路由:     
        url(r'^login/', views.login),
        
    views.py文件 --> 处理路由逻辑
    # 如果请求方式是POST 表示是请求登录的操作
        # 先去数据库拿数据,再匹配密码是否正确,
        # 不正确则进行提示,并返回登录页,正确则进入图书列表界面
    # 如果请求方式是GET,那么则直接返回登录界面回去就可以了
    
    
    ps:有一个问题就是:
        当导入的js文件就是服务器本地的文件的时候,会报错,
        需要在settings.py里面设置STATICFILES_DIRS 
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]

     

    (2) 注册
    逻辑与登录类似,只是在返回页面的时候改成reg.html
    1> 用户打开注册页面,服务端返回一个reg.html页面
    2> 用户提交注册信息,服务端处理注册操作,返回相应结果
    3> templates文件夹中同样得有reg.html文件
    
    
    ps: 
    <1>当将form表单的提交方式改为post时,由于未配置csrf中间件,会报403错误
    此时只要将settings.py文件中的MIDDLEWARE列表中的csrf注释掉就行
    
    <2> 注册提交的数据格式:
        <QueryDict: {'username': ['lisi'], 'password': ['123']}>
        通常取值方式有:
        1> 通过request.POST.get(key) 取值  --> 取出单个的元素
        2> 通过request.POST['password'] 取值  --> 不推荐,会报错
    
        通过get方法去除的值是单个的(列表最后一个元素),如果列表中的数据为多个值的时候;
        通过使用 getlist 方法,便可以取出列表中所有的值,常用于:多选框
    
    <3> 获取get请求的数据,与操作post一毛一样!!

     

    def login(request):
        # 如果请求方式是POST 表示是请求登录的操作
            # 先去数据库拿数据,再匹配密码是否正确,
            # 不正确则进行提示,并返回登录页,正确则进入图书列表界面
        # 如果请求方式是GET,那么则直接返回登录界面回去就可以了
        if request.method == 'POST':
            # username = request.POST.get('username')
            # password = request.POST.get('password')
            user_list = models.User.objects.all()
            print(user_list)
            for item in user_list:
                print(item, type(item), item.id, item.pk,  item.name, item.password)
    
        return render(request, 'login.html')
    login部分代码
    def reg(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            print(username, password)
            print(request.POST)
            user_obj = models.User(name=username, password=password,)
            user_obj.save()
            return redirect('/list/')
        return render(request, 'reg.html')
    reg部分代码
    2.2 ORM简单操作
    上面两个操作,都必须依仗 --> 查询数据
    查询数据涉及到对Django的ORM进行操作
    2.2.1 修改Django数据库模块
    
    <1> 首先先去settings.py中,修改DATA_BASES 字典文件
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day55',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456',
        修改engine,name,host,port,user,password这些内容,且key都为大写
    
    <2> 修改__init__.py文件,告诉Django使用pymysql(替换默认的mysql_db模块)
        (mysql_db模块性能不OK)
        方式一:在项目文件夹下面的__init__.py文件中修改
        方式二:在应用文件夹下面的__init__.py文件中修改
    代码:
    import pymysql
    pymysql.install_as_MySQLdb()
    2.2.2 进行ORM操作
    <1> 在应用的 models.py 文件中写映射关系
    
    代码:
    class User(models.Model):
        # 设置id为主键,其中AutoFiled为自动递增
        id = models.AutoField(primary_key=True)
        # varchar(32) name字段 
        # ps: CharField在定义时,必须加max_length
        name = models.CharField(max_length=32)
        # varchar(16) 
        password = models.CharField(max_length=20)
    
    <2> 将命令生效 --> 提交至数据库执行
        数据库前移命令
        方式一: 在pycharm的命令行(terminal)中
            python manage.py makemigrations
            python manage.py migrate
        
        方式二: 在Tools下的manage.py Task内进行操作
            在这操作的好处就是,可以省不少代码,只需要写上makemigrations migrate 就可以,并且还有提示信息,自动补全,简直不要太爽
    2.2.3 查询数据
    (1) user_list = models.User.objects.all()
    
    # 查询结果:(在models里面自定义了__str__方法)
    <QuerySet [<User: lisi>]>
    # 里面的每一个value都是 <class 'app01.models.User'>
        
    (2) user_obj = models.User.objects.get(id=user_id)
        不推荐该方法,在数据库中数据不存在时,会报错,拿到的数据是对象
        class对象,如<QuerySet [<User: lisi>]>中的lisi,不需要.first()取出数据
        

     

    class User(models.Model):
        # 设置id为主键,其中AutoFiled为自动递增
        id = models.AutoField(primary_key=True)
        # varchar(32) name字段
        # ps: CharField在定义时,必须加max_length
        name = models.CharField(max_length=32)
        # varchar(16)
        password = models.CharField(max_length=20)
    
        def __str__(self):
            return self.name
    Django ORM操作
    2.3 编辑、删除
    在原先个userlist.html中的action处,有两个按钮,一个是编辑,一个是删除,
    只需要对其button绑定相应的处理逻辑即可进行相应的事件操作
    2.3.1 删除
    <1> 在userlist.html页面中,点击删除按钮,传到后端唯一的一个pk,
    通过数据库操作,将数据删除,并返回到userlist.html页面
    
    在有查询数据的基础之后,进行删除操作操作就相对简单很多,具体见代码:
    2.3.2 编辑
    <1> 在userlist.html页面中,点击编辑按钮,跳转到edit.html页面,
    <2> 这种情况下,必须在点击的时候将目标用户的pk传到后端,后端操作数据库,
    再将数据渲染到前端页面,并显示给用户
    <3> 在用户修改信息之后,再次提交给后端,后端对数据库进行修改操作,成功之后,
    将前端页面数据渲染返回给前端显示
    在这两种情况之中,需要将用户的唯一标识pk传到后端,其方法可以分为两种:
    方式一:利用input隐藏一个标签 --> 我用的就是这个  
    方式二:可以在form标签中的action后面添加'/edit/?edit-id={{user_obj.pk}}'
    在后端,通过request.GET.get('edit_id')就可以接收提交的数据(注意,哪怕是form表单的提交方式是POST,只要是在URL中添加的数据,都是用GET方式取值)
    def delete_user(request):
        user_id = request.GET.get('delete_id')
        models.User.objects.filter(id=user_id).delete()
        return redirect('/userlist/')
    delete部分代码
    def edit(request):
        if request.method == 'POST':
            user_id = request.POST.get('edit_id')
            user_name = request.POST.get('username')
            user_password = request.POST.get('password')
            models.User.objects.filter(id=user_id).update(id=user_id, name=user_name, password=user_password)
            # user_obj = models.User.objects.filter(id=user_id).first()
            # user_obj.name = user_name
            # user_obj.password = user_password
            # user_obj.save()
            return redirect('/userlist/')
    
        pk = request.GET.get('edit_id')
        user_info = models.User.objects.filter(id=pk)
        # user_info = models.User.objects.get(id=pk)  # 不推荐,当数据不存在的时候,会报错
        user_obj = user_info.first()
        return render(request, 'edit.html', locals())
    edit部分代码

    3.完整代码

    python: 3.5
    pycharm: 2018
    Django: 1.11.11
    Mysql: 5.7
    """day55 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/1.11/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.conf.urls import url, include
        2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
    """
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^/', views.index),
        url(r'^admin/', admin.site.urls),
        url(r'^reg/', views.reg),
        url(r'^login/', views.login),
        url(r'^userlist/', views.user_list),
        url(r'^edit/', views.edit),
        url(r'^delete/', views.delete_user),
    
    ]
    urls.py
    from django.shortcuts import render, HttpResponse, redirect
    from app01 import models
    
    
    # Create your views here.
    def index(request):
        return redirect('/login')
    
    
    def reg(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            print(username, password)
            print(request.POST)
            user_obj = models.User(name=username, password=password,)
            user_obj.save()
            return redirect('/list/')
        return render(request, 'reg.html')
    
    
    def login(request):
        # 如果请求方式是POST 表示是请求登录的操作
            # 先去数据库拿数据,再匹配密码是否正确,
            # 不正确则进行提示,并返回登录页,正确则进入图书列表界面
        # 如果请求方式是GET,那么则直接返回登录界面回去就可以了
        if request.method == 'POST':
            # username = request.POST.get('username')
            # password = request.POST.get('password')
            user_list = models.User.objects.all()
            print(user_list)
            for item in user_list:
                print(item, type(item), item.id, item.pk,  item.name, item.password)
    
        return render(request, 'login.html')
    
    
    def user_list(request):
        userlist = models.User.objects.all()
        # print(userlist.query)
        # for user_obj in userlist:
        #     print(user_obj.pk, user_obj.name, user_obj.password)
        #     print(type(user_obj.pk), type(user_obj.name), type(user_obj.password))
        # print("1122233", userlist)
    
        return render(request, 'userlist.html', locals())
    
    
    def delete_user(request):
        user_id = request.GET.get('delete_id')
        models.User.objects.filter(id=user_id).delete()
        return redirect('/userlist/')
    
    
    def edit(request):
        if request.method == 'POST':
            user_id = request.POST.get('edit_id')
            user_name = request.POST.get('username')
            user_password = request.POST.get('password')
            models.User.objects.filter(id=user_id).update(id=user_id, name=user_name, password=user_password)
            # user_obj = models.User.objects.filter(id=user_id).first()
            # user_obj.name = user_name
            # user_obj.password = user_password
            # user_obj.save()
            return redirect('/userlist/')
    
        pk = request.GET.get('edit_id')
        user_info = models.User.objects.filter(id=pk)
        # user_info = models.User.objects.get(id=pk)  # 不推荐,当数据不存在的时候,会报错
        user_obj = user_info.first()
        return render(request, 'edit.html', locals())
    
    # if __name__ == '__main__':
    #     userlist(1)
    views.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    
    STATIC_URL = '/static/'  # 接口前缀,默认情况下与静态文件夹的名字一样,
                             # 可以不一样,但是网页的js地址同样要保持一致,
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]
    settings.py 只有修改的部分
    import pymysql
    
    pymysql.install_as_MySQLdb()  # 告诉Django用pymysql代替mysql_db连接db
    项目的__init__.py部分
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div class="container">
        <h1> 用户列表 </h1>
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <a href="/reg/" class="btn btn-success">添加数据</a>
                <table class="table table-striped table-bordered table-hover">
                    <thead>
                    <tr>
                        <th class="text-center">id</th>
                        <th class="text-center">name</th>
                        <th class="text-center">password</th>
                        <th class="text-center">action</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for user_obj in userlist %}
                        <tr>
                            <td class="text-center">{{ user_obj.pk }}</td>
                            <td class="text-center">{{ user_obj.name }}</td>
                            <td class="text-center">{{ user_obj.password }}</td>
                            <td class="text-center">
                                <a href="/edit/?edit_id={{ user_obj.pk }}" class="btn btn-primary" >编辑</a>
                                <a href="/delete/?delete_id={{ user_obj.pk }}" class="btn btn-danger">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    </body>
    </html>
    userlist.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-md-8 col-md-offset-2">
                    <h1>编辑页面</h1>
                    <form action="/edit/" method="post">
                        <input type="hidden"           name="edit_id"  value="{{ user_obj.pk }}">
                        <p>username:<input type="text"     name="username" value="{{ user_obj.name }}" class="form-control"></p>
                        <p>password:<input type="text" name="password" value="{{ user_obj.password }}" class="form-control"></p>
                        <input type="submit" class="btn btn-success" value="提交">
                    </form>
                </div>
            </div>
        </div>
    </body>
    </html>
    edit.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <h1> 登录界面 </h1>
                    <form action="" method="post">
                        <p>username:<input type="text" name="username" class="form-control"></p>
                        <p>password:<input type="password" name="password" class="form-control"></p>
                        <input type="submit" class="btn btn-primary" value="登录">
                    </form>
                </div>
            </div>
        </div>
    </body>
    </html>
    login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <h1> 用户注册 </h1>
                    <form action="" method="post">
                        <p>username:<input type="text" name="username" class="form-control"></p>
                        <p>password:<input type="password" name="password" class="form-control"></p>
                        <input type="submit" class="btn btn-primary" value="注册">
                    </form>
                </div>
            </div>
        </div>
    </body>
    </html>
    reg.html
  • 相关阅读:
    2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
    2015/11/1用Python写游戏,pygame入门(1):pygame的安装
    2015/10/13 算法习题:最大子列和问题
    2015/10/9 Python核编初级部分学习总结
    2015/10/9 Python基础(21):可调用和可执行对象
    2015/9/29 Python基础(20):类的授权
    2015/9/28 Python基础(19):类的定制和私有性
    2015/9/22 Python基础(18):组合、派生和继承
    2015/9/21 Python基础(17):绑定和方法调用
    MVC 依赖注入
  • 原文地址:https://www.cnblogs.com/xt12321/p/10992537.html
Copyright © 2011-2022 走看看