一、App整合
在django开发之初,就鼓励大家进行松耦合的开发。目的追求代码独立性,可迁移性,可复用性,更方便代码的修改和维护。所以我们开发django的APP的原则就是尽量让项目独立。
二、独立的url
独立的url针对多个app,也就是说在django项目当中有多个功能块儿。
1、在各自的App当中创建urls.py文件
2、在主urls当中包含子url
主urls
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += [
path('login/', include('LoginApp.urls')),
path('article/', include('Article.urls')),
path('ckeditor/', include('ckeditor_uploader.urls'))
]
子urls
from django.urls import path
from LoginApp.views import *
urlpatterns = [
path('index/', index),
path('register/', register),
path('login/', login),
path('logout/', logout),
path('au/', ajax_userValid),
path('aa/', threeydata)
]
3、访问的时候需要主url拼接子url形成完整的url进行访问
三、独立的模板
在settings当中,APP_DIRS等于True代表会自动搜索APP目录下的templates目录下的HTML文件。
之前manage.py同级目录的templates删除掉
在app当中创建新的templates目录,并且在该templates目录当中创建自己app名称(大小写可以忽略)的目录。
创建app名称的目录的目的是为了区分不同app下,相同名称的HTML,比如index.html
视图当中使用子模板系统:
Html当中使用子模板系统:
四、独立的静态文件
设置独立的url和独立的时候,目的很单纯,只是为了django项目当中的每个应用可以独立的拥有路由和模板。静态文件有点特殊,在网站开发和使用过程当中静态可以被分为两部分:
1、开发部分,就是指在开发过程当中必须的静态文件,比如:css, js, logo,background
2、使用部分,在网站使用的过程当中产生的静态文件,比如:上传的照片,文章或 者商品的图片。
但是,在web开发的工作环境部署的时候,静态文件需要单独处理,如果用户请求的是一个网页,需要返回路由,到视图进行处理,如果请求的是一个图片,服务器直接返回静态资源。
所以对静态资源的独立思路有些特殊。
1、在app当中创建static目录,并在目录下创建app名称(大小写可以忽略)的目录
2、将静态文件放入app当中创建的静态目录当中
3、进行settings配置
收集静态文件针对的是注册过的app
注释STATICFILES_DIRS、 MEDIA_URL、 MEDIA_ROOT,配置当前项目静态文件的根目录
4、进行收集命令
python manage.py collectstatic
解开STATICFILES_DIRS、 MEDIA_URL、 MEDIA_ROOT的注释,将STATIC_ROOT注释掉
6、修改前端和模型的模型文件路径
前端:
模型:
五、自定义过滤器
在我们的日常的django开发过程当中,难免遇到数据处理的问题,比如,现在通过数据采集,得到了全国3亿人的生日,然后要在前端进行展示,但是,由于数据来源多处,导致生日的格式各种各样,比如 1978-02-03 ,2018年4月16日,这个时候如果数据采集过程当中没有进行数据过滤,就需要有一种功能针对每一条数据的日期进行修改。
1、在APP当中创建templatetags包,然后在里面创建过滤器文件
2、在templatetags当中的文件里面编写过滤器
3、在settings INSTALL_APP当中安装过滤器文件
4、在前端使用过滤器
过滤器加参数
前端调用
六、自定义标签
{% %} tag
安装和配置和自定义过滤器相似
1、在自己的app里建一个templatetags包,在包里创建一个后面要在HTML文件引用的py文件
2、在py文件中,先导入from django import template
代码分为两个部分
第一部分是注册和参数处理是一个函数
第二部分是一个模板节点类,用来处理标签的逻辑
from django import template
register = template.Library()# 实例化注册对象
@register.tag(name="addnum")# 标签在模板中使用时的name
def addnum(parser,token):
"""
功能:用来接收标签内容进行切分处理
:param parser: 用来编写携带的end标签使用
:param token: 标签里面的内容
:return: 标签内容处理的节点类
"""
try:
content = token.split_contents()#{% addnum '3' %} ['addnum',"'3'"]
tag_name,tag_content = content
except ValueError as e:
msg = str(e)
raise template.TemplateSyntaxError(msg)
return AddNum(tag_content[1:-1]) #tag_content[1:-1]作用是去掉双引号
class AddNum(template.Node):
"""
用来处理具体标签逻辑,并且返回结果
"""
def __init__(self,format_string):
self.format_string = format_string
def render(self, context):
result = int(self.format_string)+1
return result
我们现在来着重看下上面这段代码是如何工作的。
Django模板解析器扫描整个模板,碰到了addnum这个标签,把其当作一个新的节点Node,获取了addnum ‘7’ 这一串字符串作为token
利用token自带的split_contents方法把上述字符串拆分成两部分: 标签名(tag_name),内容(tag_content), 并返回AddNum节点类处理。tag_content[1:-1]的作用是去掉双引号。
AddNum这个节点类负责渲染节点,通过render方法渲染新的节点,还可以通过context给模板传递其它的变量。当render方法不返回一个具体的值的时候,需要返回一个空字符串。
自定义标签比自定义过滤器可以更好的处理多参数问题。
过滤器函数只能传一个参数,
自定义标签可以写多个参数