创建配置项目
执行danjo-admin.exe startproject [projectname]
创建一个项目。
执行django-admin.exe startapp [appname]
创建一个app。
这里peoject和app的区别,可以认为是一个总分的关系,一个项目中可以包含有多个app,每个app可以负责项目中的不同模块,通过各自的urls.py
实现路由。
之后大概需要自行创建views.py、urls.py
等文件,如果有了自然不同担心,这里给个模板,没有的话照着复制粘贴一下。
视图文件
filename:views.py
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
context={}
context['TestMessage']='hello,world<hr>这是tutorial的app'
return render(request,'index.html',context)
#return HttpResponse('ssss')
路由文件,这个路由文件是主app中的文件,tutorial是第二个app,在路由文件中导入其他app路由时需要使用到include
,一定要先引入包from django.conf.urls import include
,不然报错。
filename:urls.py
from django.conf.urls import url,include
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#默认路由
url(r'^$',views.index),
url(r'^tutorial/',include('tutorial.urls')),
]
还需要创建模板文件,模板就是前端的html页面,在每个app文件夹下新建templates
,名字随意,叫这个为了方便整齐。
修改一下主app中的setting.py文件,这个配置文件一个项目只有一个,由于我们拥有两个app,需要先安装第二个app,tutorial
就是我的第二个app。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tutorial',
]
修改其中的模板信息,模板路径修改一下’DIRS’
这个键。
要注意,这里的选择性比较多,会有一点坑,分为几种情况
‘DIRS’=[]
而且没有安装过app:那么不仅app的网站不能访问到,连主app的网站即BlueSite
也无法访问,会报错TemplateNotFound
。解决办法有两个: 一个是按照 [ 情况2 ] 手动设置路径,第二个时按照 [ 情况4 ] 配置好后直接去对应app目录下寻找模板文件。‘DIRS’=[BASE_DIR+"/BlueSite/templates",BASE_DIR+"/tutorial/templates"]
:这个是分别指定模板的路径,django会依次在文件夹中寻找对应名称的html文件,比如这里的两个文件中都有index.html
,那么访问index.html
的时候,会优先访问BlueSite
路径下的文件,而不会访问到后者,因为前者在前优先。‘DIRS’=[]
:即为空,不管其余app中是否有对应的模板文件夹或者文件,django只会去主路由下的模板文件夹中寻找,即在BlueSite/templates
文件夹中。‘DIRS’=[],‘APP_DIRS’=True
而且根据上一个步骤安装过app:那么就不用担心了,只需要在每个app目录下新建一个templates
文件夹放置对应的模板文件即可,因为’APP_DIRS’
这个选项意思就是在每个app目录下搜索templates
文件夹去寻找模板文件,前提是已经安装了app。
#'DIRS': [BASE_DIR+"/BlueSite/templates"],
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
BASE_DIR+"/BlueSite/templates",
BASE_DIR+"/tutorial/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',
],
},
},
]
坑
templates模板文件夹中html名称冲突
其实上面配置模板的时候没有成功,还是有可能冲突,下面有一个比较好的解决方案。
在setting.py
文件中安装app,这个是肯定的,上面只安装了第二个,但是应该是最好全部安装,即有几个app写几个,如下,我有三个,我就安装了三个app。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'BlueSite',
'tutorial',
'blog',
]
templates
文件目录的配置没有变,'DIRS’
空着,然后’APP_DIRS’
设为True
。
但是此时不能直接将王爷放在templates
里面,比如,在BlueSite和tutorial的templates中各有一个index.html
文件,在两个app的views.py
中如果返回index.html
的话,很有可能会一直是同一个页面,即便链接不同。因为他搜索的目录其实是一个目录,就是注册app的那个目录,并不是在各自目录下的文件夹中找模板。
为了区分不同app,在各自templates
文件夹下新建一个和app同名的文件夹,把模板放到这个文件夹里,在views.py
中调用的时候,使用BlueSite/index.html 或者 tutorial/index.html
就可以了,不冲突。
静态文件放置
可以在Django项目根目录下放置static
文件夹,也可以在不同app下分别设置单独的static
文件夹方便管理各自的静态文件,我觉得这样很好,就说说这个方法吧。
在setting.py
文件中配置如下,有几个app就写几个。
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "BlueSite", "static"),
os.path.join(BASE_DIR, "tutorial", "static"),
os.path.join(BASE_DIR, "blog", "static"),
]
在各自app目录下新建static
文件夹,在其中新建一个app同名文件夹,也是用于标记不同app,在同名文件夹下新建如css,js,image
等文件夹。
引用的话,在html文件的head里这么写就好了。
{% load static %}
<link rel=stylesheet href="{% static 'BlueSite/css/index.css' %}">
这里有个小技巧
可以把每个app各自的文件放在各自的静态文件夹内,把jquery之类的通用静态文件放在根目录下的静态文件夹中,直接如下引用即可
<script language="JavaScript" src="js/jquery-3.3.1.min.js"></script>