python自学程序猿阵线联盟-汇总各类技术干货

Python篇-Django框架详解(二)

2018-02-08  本文已影响98人  TianTianBaby223

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中对应的写法

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')
urlpatterns = [
    path('myhome/',views.myHome.as_view()),
]
  1. 模板文件上传

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

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')
<!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. 字典在模板中的嵌套

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

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})

<!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 这种类型的形式 .

    re_path('detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),
<!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. 数据库表编写及创建
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

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

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. 多表外键关联

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

上一篇下一篇

猜你喜欢

热点阅读