Day_19-Django(二)
本节内容概要:
一、路由系统URL
二、视图
三、模板
四、ORM操作
问题1:Django请求生命周期
-> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
-> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容
问题2:创建Django project
django-admin startproject xxx
cd xxx
python manage.py startapp CMDB
创建项目的所有步骤
1. 创建Django工程 django-admin startproject 工程名 2. 创建APP cd 工程名 python manage.py startapp cmdb 3、静态文件 project.settings.py STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) 4、模板路径 DIRS ==> [os.path.join(BASE_DIR,'templates'),] 5、settings中 middlerware # 注释 csrf 6、定义路由规则 url.py "login" --> 函数名 7、定义视图函数
app下views.pydef func(request): # request.method GET / POST # http://127.0.0.1:8009/home?nid=123&name=alex # request.GET.get('',None) # 获取请求发来的而数据 # request.POST.get('',None) # return HttpResponse("字符串") # return render(request, "HTML模板的路径") # return redirect('/只能填URL')
8、模板渲染
特殊的模板语言-- {{ 变量名 }} def func(request): return render(request, "index.html", {'current_user': "alex"}) index.html ..`current_user`====> 最后生成的字符串 ..alex-- For循环 def func(request): return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']}) index.html ..`current_user`
- {% for row in user_list %} {% if row == "alex" %}
- {{ row }} {% endif %} {% endfor %}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
一、路由系统URL
1.三种方式
1、url(r'^index/', views.index), url(r'^home/', views.Home.as_view()),2、url(r'^detail-(\d+).html', views.detail), 3、url(r'^detail-(?P\d+)-(?P \d+).html', views.detail)
ps:
def detail(request, *args,**kwargs):
pass
实战:
1.url(r'^detail-(\d+)-(\d+).html', views.detail),
def func(request, nid, uid): pass def func(request, *args): args = (2,9) def func(request, *args, **kwargs): args = (2,9)
2.url(r'^detail-(?P
def func(request, nid, uid): pass def funct(request, **kwargs): kwargs = {'nid': 1, 'uid': 3} def func(request, *args, **kwargs): args = (2,9)
name
对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****
url(r'^asdfasdfasdf/', views.index, name='i1'),url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),url(r'^buy/(?P\d+)/(?P \d+)/', views.index, name='i3'),def func(request, *args, **kwargs): from django.urls import reverse url1 = reverse('i1') # asdfasdfasdf/ url2 = reverse('i2', args=(1,2,)) # yug/1/2/ url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/ xxx.html {% url "i1" %} # asdfasdfasdf/ {% url "i2" 1 2 %} # yug/1/2/ {% url "i3" pid=1 nid=9 %} # buy/1/9/
注:
# 当前的URL
request.path_info
多级路由
project/urls.py from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^cmdb/', include("app01.urls")), url(r'^monitor/', include("app02.urls")), ] app01/urls.py from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^login/', views.login), ] app02/urls.py from django.conf.urls import url,include from django.contrib import admin from app02 import views urlpatterns = [ url(r'^login/', views.login), ]
默认值
命名空间
a. project.urls.py
from django.conf.urls import url,include urlpatterns = [ url(r'^a/', include('app01.urls', namespace='author-polls')), url(r'^b/', include('app01.urls', namespace='publisher-polls')),]
b. app01.urls.py
from django.conf.urls import urlfrom app01 import views app_name = 'app01'urlpatterns = [ url(r'^(?P\d+)/$', views.detail, name='detail')]
c. app01.views.py
def detail(request, pk): print(request.resolver_match) return HttpResponse(pk)
以上定义带命名空间的url之后,使用name生成URL时候,应该如下:
v = reverse('app01:detail', kwargs={'pk':11})
{% url 'app01:detail' pk=12 pp=99 %}
django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。
通过反射机制,为django开发一套动态的路由系统Demo: 点击下载
二、视图
1、获取用户请求数据
request.GETrequest.POSTrequest.FILES
PS:
GET:获取数据
POST:提交数据
2、checkbox等多选的内容
request.POST.getlist()
3、上传文件
# 上传文件,form标签做特殊设置
obj = request.FILES.get('fafafa')obj.namef = open(obj.name, mode='wb')for item in obj.chunks():f.write(item)f.close()
4、FBV & CBV
function base view
url.py
index -> 函数名
view.py
def 函数(request):
...
====》
/index/ -> 函数名
/index/ -> 类
====》
建议:两者都用
5、装饰器
欠
三、ORM
1.mysql和ORM对应示例
select * from tb where id > 1 # 对应关系models.tb.objects.filter(id__gt=1)models.tb.objects.filter(id=1)models.tb.objects.filter(id__lt=1)
1.根据类自动创建数据库表
创建类
a. 先写类
找到models.py:
from django.db import models
class UserInfo(models.Model): # id列,自增,主键 # 用户名列,字符串类型,指定长度 username = models.CharField(max_length=32) password = models.CharField(max_length=64)
找到如下添加最后一行:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01',]
执行命令
python manage.py makemigrations python manage.py migrate
现在已经创建了一个表:app01_userinfo
提示:如果你不是用的默认数据库那么你需要找到setting.py的DATABASE更改其内容
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', }}
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
Django默认使用MySQLdb模块链接MySQL
主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可: