一.上节的回顾:
[上一节笔记](https://blog.youkuaiyun.com/qq_33316576/article/details/79697769)
上一节我主要学了Django的创建工程和app,并且对工程和app目录下的各个文件的作用进行了了解.
此外,我还了解了Django对一个请求的最为本质的处理过程:请求->url(寻找对应的视图函数或者类)->视图(执行相
关处理,返回字符串给客户端)->客户端接受字符串,并为用户呈现在页面上.
二.路由系统(URL)
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。
你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
1.路由有两种对应视图的方式
url(r'^index/', views.index) //对应视图函数index()
url(r'^home/', views.Home.as_view()) //对应视图类Home
from django.views import View
class Home(View)
def get(self, request)
//get请求执行该函数
def post(self, request)
//post请求执行该函数.
//默认下执行dispath函数.
2.通过路由给视图传参数
url(r'^detail-(\d+).html', views.detail) //括号内的正则表达式为参数,这就表示给视图函数index()传递一个整数参数.
url(r'^detail-(?P<nid>\d+).html', views.detail) //这就表示给变量nid赋一个整数值,然后将其传递给index().
实战:
实战:
a.
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)
b.
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
def func(request, nid, uid):
pass
def funct(request, **kwargs):
kwargs = {'nid': 1, 'uid': 3}
def func(request, *args, **kwargs):
args = (2,9)
3.name(对路由关系进行命名, 以后可以根据此名称生成自己想要的URL)
url(r'^asdfasdfasdf/', views.index, name='i1') name代指的是固定的url(asdfasdfasdf/)
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2')
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3')
reverse函数能根据路由关系的名字和传递的参数自动生成url.
def func(request, *args, **kwargs):
from django.urls import reverse
# 当前的URL
# request.path_info
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/
4.多级路由:
Django可以将整个工程的路由关系分发给app的路由系统中,消除两个至多个app使用相同的路由关系造成的冲突.
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),
]
5.其他知识:略
三.视图(view)
(个人目前的想法)django的视图用来处理客户端发来请求中的数据,然后将其变成字符串后返回给客户端。
1.获取用户请求数据
request.GET //获取get请求的数据
request.POST //获取post请求的数据
request.FILES //获取文件内容
request.POST.getlist() //获取checkbox等多选的内容
2.上传文件
# 上传文件,form标签做特殊设置,form标签中要添加"enctype='multipart/form-data'",
添加以后,如果表单提交的是字符串,则可由'POST'提取,如果表单提交的是文件,则可由'FILES'提取.
obj = request.FILES.get('fafafa')
obj.name
f = open(obj.name, mode='wb')
for item in obj.chunks():
f.write(item)
f.close()
五.html模板
1.字典的循环
{{% for i in dict.keys %}} //取key
{{% for i in dict.values %}} //取value
{{% for item in dict.items %}} //取key和value
{{% for key,value in dict.keys %}}
六.ORM操作
1.创建类
a.先写类
from django.db import models
# app01_userinfo,数据库中的表名(app名称+类名)
class UserInfo(models.Model):
# id列,自增,主键
# 用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
b. 注册APP
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
c. 执行命令
python manage.py makemigrations
python manage.py migrate
d. ********** 注意 ***********
Django默认使用MySQLdb模块链接MySQL
主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
import pymysql
pymysql.install_as_MySQLdb()
2.常用字段类型
字段:
字符串类型
数字
时间
二进制
自增(primary_key=True) //Mysql表里只能有一个自增列
字段的参数:
null -> db是否可以为空
default -> 默认值
primary_key -> 主键
db_column -> 列名
db_index -> 索引
unique -> 唯一索引
unique_for_date ->
unique_for_month
unique_for_year
auto_now -> 创建时,自动生成时间
auto_now_add -> 更新时,自动更新为当前时间
# obj = UserGroup.objects.filter(id=1).update(caption='CEO') //不会自动给更新时间
# obj = UserGroup.objects.filter(id=1).first()
# obj.caption = "CEO"
# obj.save() //自动更新时间
choices -> django admin中显示下拉框,避免连表查询
blank -> django admin是否可以为空
verbose_name -> django admin显示字段中文
editable -> django admin是否可以被编辑
error_messages -> 错误信息欠
help_text -> django admin提示
validators -> django form ,自定义错误信息
3.根据类对数据库表中的数据进行各种操作
5.CharField 和 EmailField 其实都是字符串字段,但当给admin用时,EmailField能提供额外的验证。
一对多:
models.py:
class UserGroup(models.Model):
uid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32,unique=True)
class UserInfo(models.Model):
username = models.CharField(max_length=32,blank=True,verbose_name='用户名')
password = models.CharField(max_length=60, help_text='pwd')
user_group = models.ForeignKey("UserGroup",to_field='uid')
如上所示,UserInfo类中虽然外键名为user_group, 但在生成的数据表中,它的名称是user_group_id, 如果在django使用user_group这个变量, 这将会代表其关联的表对象.