Python篇-Django框架详解(二)

作者: TianTianBaby223 | 来源:发表于2018-02-08 14:35 被阅读98次

    TZ : 只有少女的纯情 是绝对不能背叛的啊

    一 : 科普一分钟

    有过其他项目基础的同学们都知道数据库项目中的作用,数据也就是项目的核心部分,常常可以用来分析用户的行为和趋势,Django我们通常把这这种数据操作行为叫做ORM ->Object Relational Mapping->关系对象映射,在Django中,根据代码中的类自动生成数据库的表也叫--code first

    django.png

    二 : Django-MTV操作

    1. 在app内配置对应路由URL

    之前我们所写的路由分发文件urls.py是在Django文件夹下面所建立编写的,假如多人开发项目会存在不小心更改了他人的路由路径,或者重名导致他人路径失效.所以为了避免类似情况发生,在各自的APP下分别建立urls.py文件,而在Django文件可以进行如下操作,这样操作是程序更佳清爽明朗.

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('myapp/', include("myapp.urls")),
    ]
    

    在对应的APP中 文件可以这样设置路由路径

    from django.urls import re_path,path
    from django.shortcuts import  HttpResponse
    from django.conf.urls import url,include
    
    from myapp import views
    urlpatterns = [
        path('login/',views.login),
    ]
    
    1. CBV和FBV

    Function base views->FBV 用函数来写View中的逻辑关系
    Class base views - >CBV用类来写View中的逻辑关系
    View中对应的写法

    • 其中dispatch为内部调用函数(可以省略)在 get 或者 post 中间触发,可以利用这个函数写一些类似装饰器的功能
    class myHome(View):
    
    
        def dispatch(self, request, *args, **kwargs):
           print('执行前')
           retult = super(myHome,self).dispatch(request,*args,**kwargs)
           print('执行后')
           return retult
            # return HttpResponse('OK')
    
        def get(self,request):
    
            print(request.method)
            return render(request, '点我.html')
    
        def post(self,request):
            return render(request, '点我.html')
    
    • 在url文件中的配置
    urlpatterns = [
        path('myhome/',views.myHome.as_view()),
    ]
    
    1. 模板文件上传

    在网页会出现让我们选择文件然后上传到服务器的操作,web前段如何处理,后台又如何处理,很简单只需要用request.FILES.get即可拿到 文件对象了

    • views 后台处理操作
    def login(request):
        if request.method == "POST":
            obj = request.FILES.get('lalala')
            file_path = os.path.join('upload',obj.name)
            f = open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
            # print(v)
    
        return render(request, 'login.html')
    
    • 前段处理
      当设置 为enctype="multipart/form-data" 后台就会处理其文件数据
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>login</title>
    </head>
    <body>
    
        <form action="/login/" method="post" enctype="multipart/form-data" style="background-color: cadetblue">
            <p>
                <input type="file" name="lalala">
            </p>
        </form>
    </body>
    </html>
    
    1. 字典在模板中的嵌套

    上一篇我们了解到了列表模板语言是如何编写,如何展示的,这一篇来讲解一下字典模板语言中如何显示和编写

    • views 中的写法
    USER_DICT = {
        '1':{'name':'雪芙','age':'24'},
        '2':{'name':'子珊','age':'25'},
        '3':{'name':'意涵','age':'26'},
        '4':{'name':'冰冰','age':'25'},
        '5':{'name':'娜扎','age':'24'},
    
    }
    
    def index(request):
        return render(request,'index.html',{'user_dict':USER_DICT})
    
    
    • Templates 中的处理方法
      可以分析出来 在循环中 k 就是字典的key ,value 就是字典中的value 也就是说再循环中 在前面的就是 key,在后面的就是value
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
          <form action="{% url 'index' %}" method="post">
             <p><input type="text" name="user" placeholder="姓名"></p>
             <p><input type="text" name="age" placeholder="年龄"></p>
             <input type="submit" value="提交">
          </form>
          <h6 style="color: deeppink">请选择女仆</h6>
         <ul>
            {% for k,value in user_dict.items %}
                <li><a target="_blank" style="color: deeppink" >{{ value.name }}</a></li>
            {% endfor %}
        </ul>
    
    </body>
    
    </html>
    
    • 效果图
    页面效果.png

    三 : Django正则表达式

    正在表达式的作用:也就是为了让写法格式按照我们要求和期望那样展示给别人或者使用.
    为了美观或者seo对于某个列表详情通常会把网址设置成 www.TianTianBaby/mygirls/detail-1.html 这种类型的形式 .

    • url配置
      为什么用re_path 因为在3.0 创建时候创建Django项目 默认是path ,但是path不能识别正则.
        re_path('detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),
    
    • Templates 中的处理方法
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
          <form action="{% url 'index' %}" method="post">
             <p><input type="text" name="user" placeholder="姓名"></p>
             <p><input type="text" name="age" placeholder="年龄"></p>
             <input type="submit" value="提交">
          </form>
          <h6 style="color: deeppink">请选择女仆</h6>
         <ul>
            {% for k,value in user_dict.items %}
                <li><a target="_blank" style="color: deeppink" href="/mygirls/detail-{{ k }}-{{ k }}.html">{{ value.name }}</a></li>
            {% endfor %}
        </ul>
    </body>
    </html>
    

    四 : Django数据库操作

    1. 数据库表编写及创建
    • APPmodels.py文件中我们可以创建用户表
    class UserInfo(models.Model):
        #id列,自增,主键
        #用户名列,字符串类型,指定长度
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        user_group = models.ForeignKey("UserGroup",on_delete=models.CASCADE,to_field='uid',null=True)
    
    • 执行命令创建
      在Terminal中 输入指令,进行创建
     python3 manage.py makemigrations
     python3 manage.py migrate
    

    到此数据库就算创建成功了

    2. 数据库表的增删改查

    在Views 定义四个函数分别是增删改查

    def orm(request):
         dic = {'username' : '雪芙', 'password' :'12138'}
         obj = models.UserInfo(**dic)
         obj.save()
        return  HttpResponse('orm...')
    
    def ormDelete(request):
        models.UserInfo.objects.filter(uid=4).delete()
        return HttpResponse('ormDelete...')
    
    def ormupdate(request):
        models.UserInfo.objects.filter(id=3).update(password = '787878')
        return HttpResponse('ormUPdata...')
    
    def ormfind(request):
        # 查 result 类型是QuerySet =>Django=>[]
        # result = models.UserInfo.objects.all()
        result = models.UserInfo.objects.filter(username='baihua')
        print(result)
    
    3. 多表外键关联
    • models.py创建数据表
    
    class UserGroup(models.Model):
        uid = models.AutoField(primary_key=True)
        caption = models.CharField(max_length=32)
    
    class UserInfo(models.Model):
        #id列,自增,主键
        #用户名列,字符串类型,指定长度
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        user_group = models.ForeignKey("UserGroup",on_delete=models.CASCADE,to_field='uid',null=True)
    
    
    • 同样执行命令更新数据表
     python3 manage.py makemigrations
     python3 manage.py migrate
    

    其中在UserGroup表中 为 UserInfo的外键,在UserInfo表中自动存放的是 user_group_id 是一个字符串,但是我们在应用的时候 其实是UserGroup表中的一条实体对象.
    比如在UserInfo查找出来的数据

        obj = models.UserInfo.objects.filter(username='baihua').frist()
    

    obj进行操作
    obj. user_group 就是UserGroup结构的一条实体对象.
    可以对obj. user_group.caption 进行打印和使用

    数据表.png

    五 : 总结

    Djangoorm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句;所有使用Django开发的项目无需关心程序底层使用的是MySQLOraclesqlite....,如果数据库迁移,只需要更换Django的数据库引擎即可,现在只是基本的数据操作知识,还有更复杂的表结构,和更为奇特的方法值得我们学习和探索.

    相关文章

      网友评论

        本文标题:Python篇-Django框架详解(二)

        本文链接:https://www.haomeiwen.com/subject/vjkkzxtx.html