zoukankan      html  css  js  c++  java
  • Django框架操作之实现登录、注册功能(数据库的增、删、改、查)

    一、Django的工作流

    1:用户通过浏览器输入相应的 URL 发起 HTTP 请求(一般是 GET/POST)

    2:Django 接受到请求,检测 urls.py 文件,找到和用户输入的 URL 相匹配的项,并调用该 URL 对应的视图函数(view),例如,通常来说 urls.py 文件里的代码是这样的:

    url(r'^homepage/$', views.home_page)

    则当用户输入的 URL 为 www.某个网址.com/homepage 时,django 检测到该 URL 与上面的代码 匹配,于是调用后面的 views.home_page 视图函数,把相应的请求交给该视图函数处理。

    3:视图函数被调用后,可能会访问数据库(Model)去查询用户想要请求的数据,并加载模板文件(Template),渲染完数据后打包成 HttpResponse 返回给浏览器(Http协议)

    二、准备工作

    大致工作流程就是这样,从流程可以看出,我们需要做的就是:

    #准备工作,创建app
    python3 manage.py startapp app01
    #在配置文件(settings-->INSTALLED_APPS)中添加
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',    #或者app01
    ]
    创建APP,并添加到配置文件

    三、编写url、Http请求的视图(view)函数

    #1、编写相应的 url(urls文件中)
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.login),
    ]
    
    #2、编写处理 Http 请求的视图函数(View)
    def login(request):
        pass            #功能代码块,暂用pass填充

    四、搭建需要渲染的模板(template)

    #3、编写需要渲染的模板(template)
    
    #3.1通常建立static文件夹放入静态文件(bootstrap,js,css,image),然后在settings中配置路径
    STATIC_URL = '/static/'        #接口前缀,和静态文件夹static无关
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static')        #静态文件夹路径
    ]
    
    #3.2登录Html文件搭建
    <body>
    <div class="container">
        <div class="row">
            <h1>登录页面</h1>
            <div class="col-md-6 col-md-offset-3">
                #提交数据到后台使用form表单,action指定提交地址(3种方式)
                #1.全路径 <form action="http://127.0.0.1:8080/login/">
                #2.只写路径后缀 <form action="/login/">
                #3.不写,默认当前路径(http://127.0.0.1:8080/login/)提交
                <form action="">  
                    <p>username:<input type="text" class="form-control" name="username"></p>
                    <p>password:<input type="password" class="form-control" name="password"></p>
                    #提交数据方式:<input type=‘submit’> 或 <button></button>
                    <input type="submit" class="btn btn-success">
                </form>
            </div>
        </div>
    </div>
    </body>

    五、具体视图函数功能实现

    5.1登录视图测试

    #4.1根据用户请求类型,执行对应功能
    '''
        由于form表单提交数据默认get请求,实际提交数据是POST请求,需要修改客户端的请求类型(获取客户端请求类型:request.method)。
           通过<form action="" method="post">直接修改会报错(403),还需注释settings中
     MIDDLEWARE 的'django.middleware.csrf.CsrfViewMiddleware',
    '''
    def login(request):
        if request.method =='POST':
            return HttpResponse('OK')
        return render(request,'login.html')
    

    #4.2获取用户数据(GET/POST请求获取方式一致) ''' 尝试打印 print(request.POST),可将其看做字典存放了post提交的数据。 字典中的value是列表结构,但取值时拿到的是单个元素; 获取列表元素: request.POST.get('username');默认获取列表最后一个元素。
            request.POST['username'];不推荐使用(键不存在直接报错)
    若字典中value有多个元素可使用(用户爱好,多选框): request.POST.getlist('username');
    ''' def login(request): if request.method =='POST': print(request.POST) #可将其看做字典,存放了post提交的所有数据 #获取列表数据,使用的username是根据前端<input...name="username"> name属性 print(request.POST.get('username')) print(request.POST['username'] print(request.POST.getlist('username') #获取列表中所有数据 return HttpResponse('OK') return render(request,'login.html')

    5.2数据库的连接和配置

    #4.3连接数据库
    '''
    使用PyCharm连接数据库: DataBase-->DataSource-->下载驱动-->配置参数-->Test Connection Django连接数据库配置(settings文件): 1.修改配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day55', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '51cwdqgcs',}} 2.用pymysql替换默认的mysql_db模块连接数据库 在项目文件夹或应用文件下__init__.py写入 import pymysql pymysql.install_as_MySQLdb() '''

    5.3 Django的ORM

    class User(models.Model):        #在app01-->models中创建类继承 models.Model
        id = models.AutoField(primary_key=True)     #添加相应字段
        name = models.CharField(max_length=32)    #CharField定义时必须指定max_length参数
        password = models.CharField(max_length=32)
    再执行数据库迁移命令              
    '''
    1.django的ORM不能自动创建库(手动创建数据库),但可以自动创建表。
    2.
        python3 manage.py makemigrations 将数据库变动记录到migrations文件夹下
        python3 manage.py migrate 将数据库变动同步到数据库    
    '''

    5.4通过ORM实现数据库的增、删、改、查

    #4.5通过测试Djang的ORM(增、删、改、查)
    #
    def reg(request):
        if request.method=='POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            #操作数据库user表插入数据
            #方法一
            #user_obj=models.User.objects.create(name=username,password=password)
            #方法二
             user_obj=models.User(name=username,password=password)
             user_obj.save()
            # print(user_obj)
            # print(user_obj.name)
            # print(user_obj.password)
            return HttpResponse('注册成功')
        return render(request,'reg.html')
                              
     #增(完善):在数据展示页面增加‘添加’数据按钮
     #href属性指定跳转的页面(注册)
     <a href="/reg/" class="btn btn-success">添加数据</a>
    #完成添加数据后,点击按钮重定向'数据展示'页面
     return redirect('/userlist/')
    添加数据
    #
    def userlist(request):
        user_list=models.User.objects.all() #获取所有数据
        #user_list是QuerySst对象,点query获取当前对象内部sql语句
        print(user_list.query)
         #循环打印用户信息,放入html
        #for user_obj in user_list:
            #print(user_obj.password,user_obj.name)
            return render(request,'userlist.html',locals())
    数据查询
    #定义修改视图函数
    def edit(request):
        if request.method == 'POST':
            print(request.POST)
            print(request.GET)
            username = request.POST.get('username')
            password = request.POST.get('password')
            # 获取编辑对象的id方式
            edit_id = request.POST.get('edit_id')
            # 更新数据库
            models.User.objects.filter(id=edit_id).update
                  (name=username,password=password)
            #重定向'数据展示'  页面
            return redirect('/userlist')
        # 获取用户想要修改的数据的id
        edit_id = request.GET.get('edit_id')
        # 将该数据查询出来渲染到一个编辑页面
        # 查询数据方式1
        user_obj = models.User.objects.filter(id=edit_id).first()
        # 查询数据方式2
        # # user_obj = models.User.objects.get(id=edit_id)
        # print(user_obj,type(user_obj))
        # 将当前数据渲染到一个编辑页面上
        return render(request,'edit.html',locals()) 
    修改
    #删除
     #在数据展示页面增加‘删除’数据按钮,在指定跳转路径后拼接用户ID(GET请求可以携带的参数就是在路径后拼接)
     <a href="/delete_user/?delete_id={{ user_obj.pk }}" 
                  class="btn btn-warning">删除</a>
     #定义删除视图函数
     def delete_user(request):
        delete_id=request.GET.get('delete_id')
        # res_1 = models.User.objects.filter(id=delete_id)
        # print(res_1)  # QuerySet对象 <QuerySet [User:jason]>
    
        #QuerySet对象索引取值获取数据对象
        # res = models.User.objects.filter(id=delete_id)[0]
        # res=models.User.objects.filter(id=delete_id).first()
        # print(res)  #数据对象,才能res.id取值
    
        #删除queryset内所有数据对象
        res = models.User.objects.filter(id=delete_id).delete()
        return redirect('/userlist/')
    删除

     

     

  • 相关阅读:
    HDU 2643 Rank:第二类Stirling数
    HDU 4372 Count the Buildings:第一类Stirling数
    HDU 3625 Examining the Rooms:第一类Stirling数
    HDU 3682 To Be an Dream Architect:查重【三维坐标系中点在实数上的映射】
    POJ 3311 Hie with the Pie:TSP(旅行商)【节点可多次经过】
    bzoj 1050 旅行comf
    luogu 3958 奶酪
    luogu 3952 时间复杂度
    luogu 3951 小凯的疑惑
    bzoj 1016 最小生成树计数
  • 原文地址:https://www.cnblogs.com/yuanlianghong/p/10987877.html
Copyright © 2011-2022 走看看