在Django中,每个应用对应一个Python包,并且遵循同样的约定。Django自带一个工具,可以帮助我们自动生成Django应用的基础目录结构,十分方便。
项目和应用的区别
应用:是一个专门做某件事情的网站应用程序,比如博客系统,或者公共记录的数据库,或者简单的投票程序。
项目:是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被很多个项目使用。
现在要创建的应用,会创建在和DjangoDemo/DjangoDemo同级的目录,这样子它就可以作为顶级模块导入,而不是DjangoDemo的子模块
1.先来到manage.py所处的目录下,然后执行命令:
python manage.py startapp polls
2.创建成功的polls应用:
3.注册应用
在DjangoDemo/DjangoDemot/settings.py文件注册新增的应用polls:
写法:
子应用名.apps.子应用名首字母大写Config
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 注册子应用
'polls.apps.PollsConfig' # 大部分情况简写成'polls'
]
写完后在polls的包下会生成apps.py文件:
from django.apps import AppConfig
class PollsConfig(AppConfig):
name = 'polls'
4.编写第一个视图
polls/views.py
(管理视图,好比URL对应的内容)
这里添加视图函数:
1.第一个参数requests是HttpRquest对象,包含前端用户的所有请求信息。
2.返回值必须是一个HttpResponse对象或者子对象
# 新增如下代码
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
return HttpResponse("你好, django. You're at the polls index.")
def login(request):
# 可以通过request对象拿到请求的所有数据
if request.method == 'GET': # 大写
return HttpResponse(" You're at the polls login.GET请求")
elif request.method == 'POST':
return HttpResponse(" You're at the polls login.POST请求")
else:
return HttpResponse(" You're at the polls login.其它请求")
5.编写“目录”
一个view创建后,如果想要起到效果,我们需要创建一个url去映射到这个视图。所以此时我们需要在该polls应用目录下创建一个url声明文件urls.py
5.1.urls.py
PS.实际上,一个项目往往会有多个app,那么Django是如何区分这些app的urlname的呢?这时候可以使用URL conf
的命名空间。也就是在各个app的urls.py
文件的开头,添加上一个app_name
变量来指定该app的命名空间
from django.urls import path
from . import views
## 指定当前应用的命名空间
app_name = 'polls'
urlpatterns = [
# url路径,所映射的view方法,对应的名称
path(r'', views.index, name="index"),
# 注意不需要/
path(r'login', views.login, name="login"),
]
6.在项目中绑定应用
应用的内容创建完毕,接下来就需要到项目根目录的urls.py文件中去绑定所创建的应用的polls.urls模块
DjangoDemo/DjangoDemourls.py:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
// host后面的第一级路径、所映射应用的所有url都在该一级路径下
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls) # 进入localhost:8000/admin会进入Django的admin管理页面
]
- include()
路由转发
允许引用其它 URLconfs。每当 Django 遇到 :func:~django.urls.include 时,它会截断与此项匹配的 URL 的部分,并将剩余的字符串发送到 URLconf 以供进一步处理。它的设计理念是即插即用,因为一个应用会有多个url和view,所以希望使用include()
配置了一条以后,就能够访问该应用下的所有的路径,比如说"/polls/"、"/polls/login"
什么时候使用include()?
除了admin.site.urls以外,匹配其它url时都应该使用include()
还可以这样灵活使用include()进行路由转发
### 原来的路由配置
from django.urls import path
from . import views
urlpatterns = [
path('<page_slug>-<page_id>/history/', views.history),
path('<page_slug>-<page_id>/edit/', views.edit),
path('<page_slug>-<page_id>/discuss/', views.discuss),
path('<page_slug>-<page_id>/permissions/', views.permissions),
]
### 优化后
urlpatterns = [
path('<page_slug>-<page_id>/', include([
path('history/', views.history),
path('edit/', views.edit),
path('discuss/', views.discuss),
path('permissions/', views.permissions),
])),
]
7.访问
http://127.0.0.1:8000/polls/
http://127.0.0.1:8000/polls/login