Django的基础知识 II
- 路由系统URL
- 视图
- 模板
- ORM操作
- Django的基础知识 I 回顾
一,路由系统 URL
1,url or path
django 版本 2…
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<nid>\d+)-(?P<uid>\d+).html',views.detail),#指定具体值,不论顺序
django 版本 3…
from django.urls import path,re_path
1,path('home/',views.Home.as_view()),path('detail/',views.detail),
2,re_path('detail-(\d+).html',views.detail), #正则表达式匹配,导入 re_path模块
3,re_path('detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail),#指定具体值,不论顺序
PS:
def detail(request, nid,*args, **kwargs):
#nid,元组,键值对 按顺序进行形式输入和存放
2,实战:
a.re_path(‘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.re_path(‘detail-(?P\d+)-(?P\d+).html’,views.detail)
def func(reuqest,nid,uid):
pass
def func(request,**kwargs):
kwargs = {'nid':1,'uid':3}
def func(request,*args,**kwargs):
args = (2,9)
3,name
对URL路由关系进行命名,以后可以根据此名称生成自己想要的URL
path('index/', views.index,name='index1'),
re_path('index/(\d+)', views.index,name='index2'),
re_path('detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.index,name='index3')
def func(request,*args,**kwargs):
from django.urls import reverse
url1 = reverse('i1') #index/
url2 = reverse('i2',args=(1,2,)) #index/1/2/
url3 = reverse('i1',kwargs={'nid':1,'uid':9) #index/1/9
xxx.html
4,模板语言:
{% url "index1" %} #index
{% url "index2" 1 2 %} #index/1/2/
{% url "index3" nid=1 uid=9 %} #index/1/9
注:
# 当前的URL
request.path_info
5,路由分发
from django.conf.urls import url,include
#再创建一个app02,分发url
urlpatterns = [
path('cmdb/',include("app01.urls")),
path('monitor/',include("app02.urls")),
]
cmdp --> app01urls
montior --> app02urls
6,默认值
7,命名空间
二,视图
1,获取用户请求数据
request.GET
request.POST
request.FILES
PS:
GET:获取数据
POST:提交数据
2,checkbox 等多选的内容
request.POST.getlist()
select multiple
3,上传文件
obj = request.FILES.get('fafafa')
file_path = os.path.join('upload',obj.name)
f = open(file_path,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操作
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)
创建类
app01 userinfo
a.先写类
app01 下的models.py
class UserInfo(models.Model):
#id列,自增,主键
#用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=16)
b.注册app
对于多个app,需要在settings 的
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01', #添加声明
]
中先行添加 app名称
c.执行命令
python manage.py makemigrations
python manage.py migrate
d.注意
Django 默认使用MySQLdb 模块链接MYSQL(python3 还没有该模块)
主动修改为 pymysql 在 project同名文件夹下的 __init__ 文件中添加如下代码
import pymysql
pymysql.install_as_MYSQLdb()
–根据类自动创建数据库表
app01 下的models.py
python manage.py makemigrations
python manage.py migrate
–字段:
字符串类型
数字
时间
二进制
自增(primary_key = True)
–字段的参数
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.save()
choices ->django admin 中显示下拉框,避免连表查询
blank ->django admin 是否可以为空
verbose_name ->django admin 显示字段中文
editable ->django admin 是否可以被编辑
error_messages ->错误信息
help_text ->django admin 提示
validators ->django form,自定义错误信息
–修改使用的数据库
a.对于需要修改 使用mysql(默认使用sqlite)
可以在settings 中的
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
修改为
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'dbname',
'USER': 'root',
'PASSWORD': 'xxx',
'HOST': '',
'PORT': '',
}
}
b.由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
如下设置放置的与project同名的配置的 init.py文件中
import pymysql
pymysql.install_as_MySQLdb()
2,根据类对数据库表中的数据进行各种操作
一对多
a.外键
b.外键字段_id
c.models.tb.object.create(name='root',user_group_id = 1)
d.
userlist = models.tb.object.all()
for row in userlist:
row.id
row.user_group_id
row.user_group.caption
Django 基础知识 I 回顾
1,Django 请求生命周期
-> URL 对应关系(匹配)-> 视图函数 ->返回用户字符串
-> URL 对应关系(匹配)-> 视图函数 -> 打开一个html文件,读取内容
2,创建django project
django-admin startproject mysite
mysite
mysite
-配置文件
-url.py
-settings.py
cd mysite
python manage.py startapp cmdb
..
mysite
mysite
-配置文件
-url.py
-settings.py
cmdb
-views.py
-admin.py
-modles.py 创建数据库表
3,配置
模板路径
静态文件路径
注释 CSRF
4,编写程序
a. url.py
/index/ -> func
b. views.py
def func(request):
#包含所有的请求数据
...
return HttpResponse("字符串")
return render(request,'index.html',{''})
return redirect('url')
c. 模板语言
return render(request,'index.html',{'li':[11,22,33]})
{% for item in li %}
<h1> {{ item }}
{% endfor %}
5,索引 用 .
<h2>{{item.0}}<h2>
泡泡:
一般 GET 和 POST 的用法是
GET:获取数据
POST:提交数据