前面几篇文章学习了很多东西,为了避免丢失,所以准备在这篇文章中做一个总结。创建django工程和APP的命令:
django-admin startproject 工程名python manage.py startapp myapp
pycharm运行django程序需要注意是整个django工程的运行,而不是单个文件运行,呢样是不起作用的。
配置文件settings.py
创建好之后第一件事就是配置静态文件和模板路径,这些都需要在django程序目录下的settings.py文件中进行操作,比方说我刚才创建的django工程名为mydjango,那么在mydjango\mydjango文件夹下会存在__init__.py、asgi.py、settings.py、urls.py、wsgi.py。这里按照规定,在django的根目录下,也就是templates同级目录下创建静态文件static,这两者名字是规定好的,建议不要随便修改,templates存放模板,static存放静态文件。
配置静态文件project.settings.py中
STATIC_URL ='/static/'#访问静态文件的URL前缀STATICFILES_DIRS=(#存放查找静态文件的目录os.path.join(BASE_DIR,'static'),#文件名字)
配置模板路径project.settings.py中
TEMPLATES =[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[os.path.join(BASE_DIR,'templates')]#当前目录加上templates,'APP_DIRS':True,'OPTIONS':{'context_processors':['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]
处理csrf 报错 两种方式
(1.) 注释setting.py中的MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',](2.)在views.py中导入from django.views.decorators.csrf import csrf_exempt在模板函数上添加装饰器@csrf_exempt
路由系统urls.py
django请求的生命周期就是从视图函数(获取模板+数据=django进行渲染),字符串返回给用户,我们来通过一张图了解一下具体的顺序:
在urls.py中定义路由规则有三种方式(path、url、re_path),在django的3.0.5版本中,默认是使用path方式定义URL路由规则,不支持正则匹配:
from django.contrib import adminfrom django.urls import pathfrom myapp1 import viewsurlpatterns =[path('admin/', admin.site.urls),path('index/', views.index),path('index_app/', views.index_app),]
使用正则匹配,可以使用url,也可以使用re_path:
from django.conf.urls import urlfrom myapp1 import viewsurlpatterns =[url(r'^index/',views.index),url(r'^indexapp/',views.index_app),#url(r'^index-(?P\d+)/',views.index),#def index(request,pid)#url(r'^index-(?P\d+)/-(?P\d+)/',views.index),#def index(request,pid,nid)#url(r'^index-(?P\d+)/-(?P\d+)/....',views.index),#def index(request,*args,**kwargs) ]from django.conf.urls import re_pathfrom myapp1 import viewsurlpatterns =[re_path(r'^index/',views.index), re_path(r'^indexapp/',views.index_app),]
正则匹配需要结合视图函数进行说明,这里不多介绍,参考视图部分。
在较低版本的django中,正则匹配存在路由屏蔽,按照上面的URL规则,访问indexapp/会首先进入index/,而永远不会进入index/,但是在django3.0.5中不存在这种情况,两者都可以正常访问,为了规范起见,在正则匹配的时候需要写为:r'^index/$'。
URL路径问题
URL规则中的/非常关键,鳄鱼君在前面提到过,规范起见需要在定义的时候加上/,那么在模板中,如果需要使用form表单提交信息的时候,action属性的url必须为/路径/,而不是/路径,这方面问题可能都在这里。
在这里先说明,如果存在多个app,为了定义和修改更加方便,在mydjango\mydjango下的urls.py中可以使用include:
from django.urls import path,includeurlpatterns =[path('myapp1/', include("myapp1.urls")),#URL规则为http://127.0.0.1:8000/myapp1,则会交给myapp1.url这个路径匹配path('myapp2/', include("myapp2.urls")),#同上path('myapp3/', include("myapp3.urls")),]
然后在app文件夹中可以创建urls.py来定义某个app专用的URL规则:
from django.urls import pathfrom myapp1 import viewsurlpatterns =[path('index/', views.index),]
在路由规则中每个URL对应不同的视图函数,在django中存在FBV和CBV,上面的就是FBV(Function Base View),那么还有CBV(Class Base View):
from django.urls import pathfrom myapp import viewsurlpatterns =[path('login/',views.login)path('index/',views.Index.as_view())#执行类的as_view()方法,固定的用法]views.py中存在login函数和Index类def login(request):passfrom django.views importViewclassIndex(View):#如果GET请求执行get方法defget(self,request):pass#如果POST请求执行post方法def post(self,request):pass
用法固定,更多介绍可以往下参考视图函数的具体说明。路由规则还有反转什么的,这里不多介绍!
视图函数views.py
视图函数使我们处理不同URL的重要内容,我们想要返回给用户什么样的信息,就需要在这里定义。承接路由中的views.index。每一个URL规则在views视图中都应当存在对应的函数或者类,以url(r'^index/',views.index),为例,那么views中的index函数必须携带一个参数,假设为request,通过这个参数我们才能获取到用户提交的信息:
浏览器访问GET方式 form表单POST方式def index(request):request.method #用户的请求方式request.path_info #湖获取当前请求的URLrequest.POST.get('name')#或取post提交的name值 request.POST.getlist('name')#get的是name值,后台显示的是value值 checkbox 多选框file=request.FILES.get('name')#上传图片file_path = os.path.join('update', file.name)#上传到update文件夹中f = open(file_path,'wb')for i in file.chunks(): #循环图像文件写入f.write(i)f.close()
每个视图函数都必须有return返回值,通常有以下几种:
from django.shortcuts import render,redirectfrom django.shortcuts importHttpResponsedef index(request):....returnHttpResponse('字符串')return render(request,'模板路径',{'v':v})#第一个参数为用户的信息,就是函数中的requestreturn redirect('URL')#重定向
针对url(r'^index-(?P\d+)/-(?P\d+)/',views.index), 规则,函数就需要两个参数来接收URL中的pid,多个值函数就需要多个参数,一般可以使用下面的方式,类和函数同用:
def index(request,*args,**kwargs):passfrom django.views importViewclassIndex(View):#如果想自定制功能需要重写dispatch函数defget(self,request,*args,**kwargs):pass#类中可以处理以下的请求方式http_method_names =['get','post','put','patch','delete','head','options','trace']#只需要定义对应的函数就可以了
FBV和CBV两者可以结合使用,如果不知道*args和**kwarags是什么,这涉及到函数的有关内容,自行充电。
模板语言
def index(request):return render(request,'index.html',{'username':"鳄鱼君",'k1':[1,2,3,4,5,6],'k2':{'name':'鳄鱼君1','age':18}})模板index.html
- {# 循环字典k2 #}{%for k,v in USER_DICT.items %}{# 循环字典 i是key keys和values方法同字典 #}
- {{ k }}-{{ v }}{% endfor %}
年龄
{%if age >18%}#嵌套年龄
{%else%}年龄
{% endif %}{%else%}年龄
{% endif %}#语句结束for循环和if结合使用...ORM操作
涉及到创建类以及生成数据库表,数据库表的增删改查可参考:Django框架基于ORM的增删改查基本操作,在此之前需要输入命令和注册app,都有详细介绍的。主要整理一下关于外键关联的数据查询
外键
UserInfo表关联UserGroup,我们从UserInfo中提取UserGroup表中的数据只需要通过点来操作,非常的简单。这个可是对接前面的创建django数据库,不会的可以略过!
第一种方式获取外键关联的表单数据
def user_group(request):v1=models.UserInfo.objects.all()#获取所有列#QuerySet类型可以看作列表,每个元素都是一个对象 对象中包含所有的列 [obj(id,...),obj(id,...) ]for row in v1:print(row.id,row.username,row.password,row.user_group_id,'\n',row.user_group.caption,row.user_group.ctime)#直接通过.来取UserGroup表return render(request,'user_group.html',{'v1':v1})模板提取数据{%for row in v1 %}
{{ row.id }}-{{ row.username }}-....{% endfor %}第二种方式获取外键关联的表单数据
def user_group(request):#获取id,username,user_group_id为UserInfo表中的列,其余的为UserGroup中的列 v2=models.UserInfo.objects.all().values('id','username','user_group_id','user_group__caption','user_group__utime')#QuerySet类型 列表中是一个字典,而不是对象 [{'id':1,'username':'鳄鱼君'}]for row in v2:#字典取值方式print(row['id'],row['username'],row['user_group__caption'],sep='\t',)return render(request,'user_group.html',{'v2':v2})模板提取数据{%for row in v2 %}
{{ row.id }}-{{ row.username }}{% endfor %}第三种方式获取外键关联的表单数据
def user_group(request):v3=models.UserInfo.objects.all().values_list('id','username')# QuerySet类型 列表中是一个元组 [(1,鳄鱼君),(2,)]for row in v3:print(row)#元组return render(request,'user_group.html',{'v3':v3})模板提取数据{%for row in v3 %}
{{ row.0}}-{{ row.1}}{% endfor %}以上是外键关联展示数据,要想在后台获取外键关联的数据需要使用神奇的双下划线
__,代码中已经记录过了,可以自己手动尝试一番。
模板语言的for循环中可以使用计数器
{{ forloop.counter }},从1开始每循环一次数值增加一次,与之相似的有forloop.revcounter(1开始倒序)、forloop.revcounter(0开始倒序)、forloop.counter0(从0开始)、forloop.last(最后一个为True)、forloop.first(第一个为True),对于每一个for循环都有这样的方法。forloop.parentloop(循环嵌套)用于记录上面的呢些方法的,知道就可以。
代码本身是添加有缩进的,但是显示的没有,所以导致代码不易于阅读,如果感兴趣的关注鳄鱼君Ba,可以一起学习,鳄鱼君也是一个萌小白了!