Python篇-Django框架详解(二)

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的数据库引擎即可,现在只是基本的数据操作知识,还有更复杂的表结构,和更为奇特的方法值得我们学习和探索.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容