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. PLSQL数据库操作(excel)

    一.plsql数据库操作: 删除数据前备份一张表: create table plat_counter_def_bf as select * from plat_monitor_counter_def ...

  2. Android ADB命令大全

    通过ADB命令查看wifi密码.MAC地址.设备信息.操作文件.查看文件.日志信息.卸载.启动和安装APK等   ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列号: adb get-s ...

  3. 【淘淘】Spring整合Quartz框架

    我在外面工作实习的时候,我们做的项目是一个日报子系统,也就是定时定点为公司生成一些报表数据还有一些数据反馈.这时候我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.当时,我做 ...

  4. 【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行

    参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 1.命令执行 MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSO ...

  5. sql Lloader

    create table ban_ji(id integer,ban_ji varchar2(25))insert into ban_ji values(1,'1-(1)');insert into ...

  6. jenkins和hudson---打酱油的日子

    自动化构建:Jenkins起源于Hudson.Hudson在商业软件的路上继续前行,而Jenkins则作为开源软件,从hudson分支出来. 因此现在的jenkins和hudson非常类似,但是随着二 ...

  7. About_Web

    成功网站的三要诀:内容.设计.营销 内容为王: 高质量的内容会促使网站走向成功.首先,用户有需求,他们需要被感动,被娱乐,被有料的内容和产品所吸引.漂亮的背景和亮骚的特效可能会有所助益,但终究只是辅助 ...

  8. RunLoop和autorelease的一道面试题

    有这么一道iOS面试题 以下代码有没有什么问题?如果有?如何解决? for (int i = 0; i < largeNumber; i++) { NSString *str = [NSStri ...

  9. c# winform编程之多线程ui界面资源修改总结篇

    单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...

  10. noip200802排座椅

    排座椅 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的 ...