Django框架的重要内容总结 配置文件_静态文件_路由说明_App应用配置

鳄鱼君Ba

发表文章数:514

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Django框架的重要内容总结 配置文件_静态文件_路由说明_App应用配置

前面几篇文章学习了很多东西,为了避免丢失,所以准备在这篇文章中做一个总结。创建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进行渲染),字符串返回给用户,我们来通过一张图了解一下具体的顺序:

Django框架的重要内容总结 配置文件_静态文件_路由说明_App应用配置

在urls.py中定义路由规则有三种方式(path、url、re_path),在django的3.0.5版本中,默认是使用path方式定义URL路由规则,不支持正则匹配:

from django.contrib import admin
from django.urls import path
from myapp1 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('index_app/', views.index_app),
]

使用正则匹配,可以使用url,也可以使用re_path:

from django.conf.urls import url
from myapp1 import views
urlpatterns = [
    url(r'^index/',views.index),
    url(r'^indexapp/',views.index_app),
    #url(r'^index-(?P<pid>\d+)/',views.index), #def  index(request,pid)
    #url(r'^index-(?P<pid>\d+)/-(?P<nid>\d+)/',views.index), #def index(request,pid,nid)
    #url(r'^index-(?P<pid>\d+)/-(?P<nid>\d+)/....',views.index), #def index(request,*args,**kwargs)   
]
from django.conf.urls import re_path
from myapp1 import views
urlpatterns = [
    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,include
urlpatterns = [
    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 path
from myapp1 import views
urlpatterns = [
    path('index/', views.index),
]

在路由规则中每个URL对应不同的视图函数,在django中存在FBV和CBV,上面的就是FBV(Function Base View),那么还有CBV(Class Base View):

from django.urls import path
from myapp import views
urlpatterns = [
    path('login/',views.login)
    path('index/',views.Index.as_view())  #执行类的as_view()方法,固定的用法
]

views.py中存在login函数和Index类
def login(request):
    pass
from django.views import View
class Index(View):
    #如果GET请求执行get方法
    def get(self,request):
       pass
    #如果POST请求执行post方法
    def post(self,request):
       pass

用法固定,更多介绍可以往下参考视图函数的具体说明。路由规则还有反转什么的,这里不多介绍,可参考:Django框架中路由的分发

视图函数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 #湖获取当前请求的URL
    request.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,redirect
from django.shortcuts import HttpResponse
def index(request):
    ....
    return HttpResponse('字符串')
    return render(request,'模板路径',{'v':v}) #第一个参数为用户的信息,就是函数中的request
    return redirect('URL') #重定向

针对url(r'^index-(?P\d+)/-(?P\d+)/....',views.index), #def index(request,*args,**kwargs) 规则,函数就需要两个参数来接收URL中的pid,多个值函数就需要多个参数,一般可以使用下面的方式,类和函数同用:

def index(request,*args,**kwargs):
    pass

from django.views import View
class Index(View):
    #如果想自定制功能需要重写dispatch函数
    def get(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
<div>{{ username }}</div>  #替换字符串并返回给用户
{{ k1.3 }}  {# 列表 #}
{{ k2.name }}  {# 字典 #}

{# 循环列表k1 #}
{% for i in USER_LIST %}  {# for循环开始 #}
<tr><td>{{ i.user }}</td><td>{{i.email}}</td></tr>  
{% endfor %}  {# for循环结束 #}

<ul> {# 循环字典k2 #}
    {% for k,v in USER_DICT.items %}  {# 循环字典 i是key  keys和values方法同字典 #}
    <li><a >{{ k }}-{{ v }}</a></li>
    {% endfor %}
</ul>


if判断

{% if age %} #语句开始
    <p>年龄</p>
    {% if age > 18 %}  #嵌套
        <p>年龄</p>
    {% else %}
        <p>年龄</p>
    {% endif %}
{% else %}
    <p>年龄</p>
{% endif %}  #语句结束


for循环和if结合使用...

ORM操作

涉及到创建类以及生成数据库表,数据库表的增删改查可参考:Django框架基于ORM的增删改查基本操作,在此之前需要输入命令和注册app,都有详细介绍的。主要整理一下关于外键关联的数据查询

外键

UserInfo表关联UserGroup,我们从UserInfo中提取UserGroup表中的数据只需要通过来操作,非常的简单。

第一种方式获取外键关联的表单数据

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 %}
<li>{{ row.id }}-{{ row.username }}-....</li>
{% 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 %}
<li>{{ row.id }}-{{ row.username }}</li>
{% 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 %}
<li>{{ row.0 }}-{{ row.1 }}</li>
{% endfor %}

以上是外键关联展示数据,要想在后台获取外键关联的数据需要使用神奇的双下划线__,代码中已经记录过了,可以自己手动尝试一番。

模板语言的for循环中可以使用计数器{{ forloop.counter }},从1开始每循环一次数值增加一次,与之相似的有forloop.revcounter(1开始倒序)、forloop.revcounter(0开始倒序)、forloop.counter0(从0开始)、forloop.last(最后一个为True)、forloop.first(第一个为True),对于每一个for循环都有这样的方法。forloop.parentloop(循环嵌套)用于记录上面的呢些方法的,知道就可以。

未经允许不得转载:作者:鳄鱼君Ba, 转载或复制请以 超链接形式 并注明出处 鳄鱼君Ba
原文地址:《Django框架的重要内容总结 配置文件_静态文件_路由说明_App应用配置》 发布于2020-04-15

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

7 + 1 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册