Django请求生命周期:

  首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view。

  然后,app通过判断,拿到数据库数据和html模板文件。

  最后,将拿到的数据发送到客户端。

Django获取html里面数据:

  前面我们说了,通过判断request.method == "POST"。request.POST.get获取数据。这样只能获取单个数据。

  request.POST.getlist('name'),例如checkbox复选框和下来菜单。

  文件上传:

def login(request):
if request.method == "GET":
return render(request,"login.html")
elif request.method == "POST":
obj = request.FILES.get("tijiao")
print(obj,type(obj),obj.name)
import os
file_path = os.path.join('upload',obj.name)
f = open(file_path,mode="wb")
for i in obj.chunks():
f.write(i)
f.close()
return render(request,'login.html')
else:
return redirect('/index/')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="POST" enctype="multipart/form-data">
<p>
<input type="text" name="user" placeholder="用户名" />
</p>
<p>
<input type="password" name="pwd" placeholder="密码" />
</p>
<p>
男:<input type="radio" name="gender" value=""/>
女:<input type="radio" name="gender" value=""/>
张扬:<input type="radio" name="gender" value=""/>
</p>
<p>
男:<input type="checkbox" name="favor" value=""/>
女:<input type="checkbox" name="favor" value=""/>
张扬:<input type="checkbox" name="favor" value=""/>
</p>
<p>
<select name="city" multiple>
<option value="sh">上海</option>
<option value="bj">北京</option>
<option value="tj">天津</option>
</select>
</p>
<p>
<input type="file" name="tijiao"/>
</p> <input type="submit" value="提交"/>
</form>
</body>
</html>

Django的CBV和FBV:

  function base views(FBV):

  urls.py

    index -->函数名

    views.py--def 函数(request):

            ........

  class base views(CBV):

    index --> 函数名

    index -->类

from django.views import View
class home(View:
def get(self,request):
pass
def post(self,request):
pass
还有一个地方需要更改。
django项目里的urls.py在写路由关系时候需要这么写。
url(r'^home/', views.home.as_view()),

示例:

我们知道,在执行class里面的get或post方法时候,首先是在一个dispatch里面反射找到我们定义的方法,

class Home(View):
def dispatch(self, request, *args, **kwargs):
# 调用父类中的dispatch
print("before")
result = super(Home,self).dispatch(request, *args, **kwargs)
print("after")
return result def get(self,request):
print(request.method)
return render(request,'home.html') def post(self,request):
print(request.method,'POST')
return render(request,'home.html')

   其实使用FBV还是CBV,其实看个人习惯,能实现需求就行,建议两种都使用。 

路由器系统(url):

  Django模板语言循环字典:

html写法:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ user_dict.k1}}
<ul>
{% for k in user_dict.keys %}
<li>{{k}}</li>
{% endfor %}
</ul>
<ul>
{% for val in user_dict.values %}
<li>{{val}}</li>
{% endfor %}
</ul>
<ul>
{% for k,row in user_dict.items %}
<li>{{k}}-{{row}}</li>
{% endfor %}
</ul>
</body>
</html>
#在取字典的值得时候,我们有三种取发,取key、values和全部。

django写法:

USER_DICT = {
'k1':'root1',
'k2':'root2',
'k3':'root3',
'k4':'root4',
}
def index(request):
return render(request,'index.html',{'user_dict':USER_DICT})

  1、单一路由:

url(r'^index$', views.index),       url(r'^home/', views.Home.as_view()),

  views里面定义函数的时候除了设置request形参,还需要设置设置一个形参,如果形参过多的话,容易获取的参数顺序不对

url(r'^detail-(\d+).html', views.detail),  

  

  建议使用以下这种路由,这样的话,下面函数里面的nid和nid哪个在前哪个在后就没有关系了

url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
def func(request,nid,uid):
pass

扩展:如果使用万能参数的话,除了request参数,后面有多少个参数都行,一个参数的话就是元祖,多个的话就是字典模式。

def func(request,*args,**kwargs):
pass

路由分发:

  

django下的urls.py

from  django.conf.urls import url,include

urlpatterns = [
url(r'^cmdb/', include("app01.urls")),
url(r'^moniter/', include("app02.urls")),
]

app01下的urls.py(需要自己建)

from  django.conf.urls import  url,include
from app01 import views urlpatterns = [
url(r'^login/', views.login),
url(r'^orm/', views.orm),
]

app02下的urls.py(需要自己建)

from  django.conf.urls import  url,include
from app02 import views urlpatterns = [
url(r'^moniter/', views.login),
]

这样的话,写不同app功能的人,就不会把url搞混淆了。

 Django的ORM操作:

  创建数据库表结构:

  一:

    使用python创建项目时候自带的db.sqlite3

    1、前面我们说过,创建了app以后有个叫modles.py的文件,当时说在这里创建数据的,现在我们用到了它。

在需要生成数据库表结构的app里面的models里面创建表结构(创建类,并继承modes类)。   

from django.db import models

# Create your models here.

class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)

    2、注册app(因为我们在一个项目里面肯定会有很多的功能,也就是有很多的app。这样的话,每个app里面都有models文件,django也不知道你要在哪个app里面创建表结构,所以我们需要先注册app)

在项目里面的settings.py里面找到如下内容,在最后添加你要创建到哪个app的名称。例如:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
例如我要在app01里面创建表结构

     3、然后我们需要执行两个命令,

      python manage.py  makemigrations(执行完这个命令,在你想创建表结构的app里面的migrations里面就会多出一个东西来,这个就是表结构发生变化后,自动给你生成的文件,类似于日志)

      python manage.py  migrate  (把上面那条命令的内容直接在数据库里面执行,也就是真正意义上的在数据库里面生成表结构)

  二:

    使用mysql数据库:

    1、上面写的使用db.sqlites的1和2步骤执行一遍,然后执行下面的操作。

    2、因为python3里面没有MySqldb这模块,而django默认使用的是它,因为python3里面我们用的pymsql,所以我们要在project同名下的__init__.py文件里面加上以下内容。

    

import pymysql
pymysql.install_as_MySQLdb()

    3、找到项目里面有个settings.py文件,里面有个DATEBASES的字典。

把defalut默认使用sqlite3的这个全部都注释。

DATABASES = {

    # 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
}

添加下面这些内容,注意,里面NAME是数据库名称,这个必须提前在数据库里面手动生成。

DATABASES = {

    # 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'cmdb',
'USER': 'root',
'PASSWORD': '',
'HOST': '192.168.16.200',
'PORT': '',
}
}

    4、在mysql数据库里面生成数据库表结构。

      python manage.py  makemigrations(执行完这个命令,在你想创建表结构的app里面的migrations里面就会多出一个东西来,这个就是表结构发生变化后,自动给你生成的文件,类似于日志)

      python manage.py  migrate  (把上面那条命令的内容直接在数据库里面执行,也就是真正意义上的在数据库里面生成表结构)

扩展:

  连接sqlite3方法:

    首先需要下载navicat premium。安装好后,如下:

    复制sqlite路径

     将project名称完完全全的复制到连接名里面,并将上面复制的sqlite路径粘贴到数据库文件里,就OK了。

示例:

  我们搞一个登陆验证的示例,使用的是sqlite3数据库。

  1、创建数据方法一。

  上面我们在models.py里面已经写好了数据库表结构,并已经生成了表结构。

#首先导入数据库表结构的目录
from app01 import models
#例如有个orm的字段请求,我让它发送一个请求,就帮我创建一个用户名和密码(root,123),并返回orm
def orm(request):
#下面这条才是关键,使用models.什么就是生成数据库表结构的类名,后面都是关键字,username和password都是字段名称
models.UserInfo.objects.create(username = "root",password = '')
return HttpResponse("orm")

  

  创建数据方法二。

obj = models.UserInfo(username='zhangsan',password='')
obj.save

  2、查询

result = models.UserInfo.objects.all()
for row in result:
print(row.id,row.username,row.password)
#上面这种就会取出所有的username和password的数据。 result = models.UserInfo.objects.filter(username='root',password='')
#上面这种是过滤条件,逗号充当的是and的意思

  3、删除

models.UserInfo.objects.all().delete()
#删除所有数据 #删除root用户
models.UserInfo.objects.filter(username='root').delete()

  4、更新

#将password字段全部都改成666
models.UserInfo.objects.all().uodate(password='') #根据过滤更新(让id等于3的这条数据的password改成666)
models.UserInfo.objects.filter(id=3).uodate(password='')

Python之路-(Django进阶一)的更多相关文章

  1. Python之路-(Django进阶二)

    model: 双下划线: # 获取个数 # # models.Tb1.objects.filter(name='seven').count() # 大于,小于 # # models.Tb1.objec ...

  2. 自学Python之路-django

    自学Python之路-django 自学Python之路[第一回]:1.11.2 1.3

  3. python web框架 Django进阶

    django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...

  4. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  5. Python学习-day20 django进阶篇

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  6. python之路 django基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  7. Python之路-(Django(Cookie、分页))

    Cookie 分页 1.获取Cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, sal ...

  8. python之路:进阶篇 内置函数

     li = [11, 22, 33] news = map(  li = [100, 2200, 3300] news = map(  [13, 24, 35] [11, 11, 11] [22, 4 ...

  9. python之路:进阶 二

        c = collections.Counter(  Counter({ b = collections.Counter(  b.update(c)   Counter({ Counter({  ...

随机推荐

  1. C语言中的强符号与弱符号

    转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...

  2. css样式思维导图

  3. IDF实验室:倒行逆施

    简单的PE文件逆向(.exe-IDA) 下载下来文件之后发现是一个exe文件,运行以后发现.

  4. Sharepoint+Office Infopath+快速搭建问卷调查系统

    项目背景 要开发供公司内部使用的N多个在线调查问卷,要求信息在统一的平台上方便跟踪及管理. 公司内部上了Sharepoint系统及大家习惯了使用infopath及Quick app for share ...

  5. Codeforces118D Caesar's Legions(DP)

    题目 Source http://codeforces.com/problemset/problem/118/D Description Gaius Julius Caesar, a famous g ...

  6. Leetcode Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. 不用乘.除.求余操作,返回两整数相除的结果,结 ...

  7. 【BZOJ】3994: [SDOI2015]约数个数和

    题意: \(T(1 \le T \le 50000)\)次询问,每次给出\(n, m(1 \le n, m \le 50000)\),求\(\sum_{i=1}^{n} \sum_{j=1}^{m} ...

  8. BZOJ1068: [SCOI2007]压缩

    ... 1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 909  Solved: 566[Submit][Statu ...

  9. C#_Express-ickd接口

    爱查快递接口使用 using System; using System.Collections.Generic; using System.IO; using System.Net; using Sy ...

  10. JVM中,对象在内存中的布局

    在hotSpot虚拟机中,对象在内存中的布局可以分成对象头.实例数据.对齐填充三部分. 对象头:主要包括: 1.对象自身的运行行元数据,比如哈希码.GC分代年龄.锁状态标志等,这部分长度在32位虚拟机 ...