您的位置:首页 > 编程语言 > Go语言

20190319Django路由分配与模板渲染

2019-03-22 12:10 507 查看

I. 路由系统

1. url全球统一定位符:

分为协议、域名(包括IP地址和端口)、路径(或者叫内部url,路由就是根据这个进行请求的分发)和参数(在问号后面,#xxxx是锚点)

<此处插入url构成图片解析>

变量urlpatterns是路由
URLconf模块,也就是url配置模块 > url.py

项目文件夹下的urls.py文件叫根配置文件

urlpatterns = [
path('admin/',admin.site.urls),
path('teacher/', include('teacher.urls')),
path('index/',view.index_view
)
]

">

2. path函数

path(route,view,kwargs=None,name=None)

注意,view不要加括号,加括号就变成了参数了。

  • route 是一个字符串url规则
  • view 是一个视图函数,
  • kwargs 额外的参数,是一个字典
  • name url规则的名字
crm系统,获取某个学生的详情,数据库,主键

3. 在urls里面捕获一个参数



备注:pk = primary key 主键。在urls模块里面的"pk"必须与views模块里的形参"pk"一致,否则会报错

<>代表捕获参数,所以一定要加尖括号

views.py文件中:

from django.contrib import admin
from django.urls import path, include, re_path
from . import views

urlpatterns = [
path('admin/', admin.site.urls),
path('teacher/', include('teacher.urls')),
path('student_detail/<str:pk>/', views.student_detail_view),
path('students/<int:year>-<int:month>/', views.students_list_view),
re_path(r'student_detail/?P<pk>\d+)', views.students_list_view),
re_path(r'^students/(?P<year>\d{4})-(?P<month>[1-9]|1[0-2])$', views.students_list_view),
]

4. 转换器

  • str匹配除了路径分隔符“/”之外的所有字符串,如果不写转换器,默认就是字符串转换器
  • int匹配0或任意整数
  • slug匹配任意的ASCII字符或数字组成的slug字符串,连字符和下划线
  • path匹配任意非空字符串,包括路径分隔符‘/’

应用如:

上述例子中捕获参数的pk值前面加上"int:":

<int:pk>

代码例子如下:

crm目录下的views模块中:

from django.http import HttpResponse
def student_detail_view(request, pk):
#通过pk去数据库里取值
print(type(pk))    # 打印pk值的类型
return HttpResponse('学生ID为:%s的详情'% pk)

crm目录下的urls模块中:

urlpatterns = [
path('student_detail/<int:pk>/',views.student_detail_view),
]

运行结果:
<插入crm获取学生详情程序运行后浏览器访问页面>

扩展:如果输入多于一个参数的情况应该怎么做呢?

例子:

crm目录下的views模块中:

from django.http import HttpResponse

def students_list_view(request, year, month):
return HttpResponse('%s年%s月报名学生表'% (year, month)

crm目录下的urls模块中:

urlpatterns = [
path('students/<int:year>/<int:month>/',views.students_list_view),
]

运行结果:
<插入crm获取学生报名的年份和月份>

5. 使用正则表达式

re_path(route, view, kwargs=None, name=None)

学生详情的例子:

crm目录下的urls模块中代码如下:

from django.contrib import admin
from django.urls import path, include, re_path
from . import views

urlpatterns = [
re_path(r'student_detail/(?P<pk>\d+)/',views.student_detail_view),
]

运行结果:

学生报名表的例子

crm目录下的urls模块中代码如下:

from django.contrib import admin
from django.urls import path, include, re_path
from . import views    #导入同目录下的views模块

urlpatterns = [
re_path(r'^students/(?P<year>\d{4})-(?P<month>(0?[1-9]|1[0-2]))/$', views.students_list_view),
]

crm目录下的views模块中:

from django.http import HttpResponse

def students_list_view(request, year, month):
return HttpResponse('%s年%s月报名学生表'% (year, month)

运行结果:


![正则crm获取学生报名的年月截图2019-12]](https://img-blog.csdnimg.cn/2019032212075163.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjM3MTIw,size_16,color_FFFFFF,t_70)
![正则crm获取学生报名的年月截图报错]](https://img-blog.csdnimg.cn/20190322120822952.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjM3MTIw,size_16,color_FFFFFF,t_70)

注意: 正则表达式匹配的参数都会转换成字符串str

路由匹配的规律:只要匹配到就返回,前面的匹配会覆盖后面的匹配

路由是不区分请求方法的

额外参数

crm目录下的urls模块中代码如下:

from django.contrib import admin
from django.urls import path, include, re_path
from . import views    #导入同目录下的views模块

urlpatterns = [
path('admin/', admin.site.urls),
path('teacher/',include('teacher.urls')),
path('student/',include('student.urls')),
path('student_detail/<int:pk>/',views.student_detail_view, kwargs={'args1':'value1','args2':'value2'}),
]

此时在根目录的urls中添加了额外参数args1和args2键值对,则必须在对应的views.py里添加kwargs额外参数

crm目录下的views模块中:

from django.http import HttpResponse

def index_view(request):
return HttpResponse('I am Homepage')

def student_detail_view(request, pk, arg1, arg2):
#通过pk去数据库里取值
print(type(pk))
return HttpResponse('学生ID为:%s的详情'% pk)
Note: 当额外参数与url参数冲突时(键名一致),以额外参数为准

6. url命名

redirect重定向:接收一个地址就能跳到该地址页面

示例:在teacher的app目录下:

先在teacher目录下的views模块中:

from django.shortcuts import render, redirect
from django.http import HttpResponse

def index(request):
return HttpResponse('<h1 style="color:blue">This is my 1st django project!</h1>')

def login_view(request):  #追加定义login_view函数
return redirect('/teacher/index/')

再在teacher目录下的urls模块中输入代码如下:

from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index),
path('login/', views.login_view)
]

*追加path()输入路径login,以及views方法对应的login_view函数

以上视图中重定向写法/teacher/index这种写法是硬编码,当app多的情况下,这种重定向都需要手动去改,效率会非常低。因此,动态生成重定向的方法reverse被引入:

reverse方法

依旧以teacher的应用为例:思路是,先在views模块当中的path函数中追加定义变量名为index的变量,然后将这个变量引入到urls模块当作为变量传入reverse方法中,通过这个新的变量,返回重定向,则避免了硬编码的出现。

先在teacher目录下的urls模块中输入代码:

from django.urls import path
from . import views
urlpatterns = [
path('home/', views.index, name='index'),
path('login/', views.login_view)
]

然后在teacher目录下的views模块中输入代码:

from django.shortcuts import render, redirect
from django.http import HttpResponse

def index(request):
return HttpResponse('<h1 style="color:blue">This is my 1st django project!</h1>')

def login_view(request):
home_url = reverse('index')
return redirect(home_url)

app_name方法

当不同app之间都有重定向的场景,为了区分不同app之间的重定向,我们需要对index进行区分,此时会用到app_name来定义一个新的变量,将对应的app名传入其中,在将视图中的index改为app_name:index。示例如下:

在teacher目录下的urls.py模块中代码如下:

from django.urls import path
from . import views

app_name = 'teacher'  # 新增app_name传入变量值
urlpatterns = [
path('home/', views.index, name='index'),
path('login/', views.login_view),
]

在teacher目录下的views.py模块中代码如下:

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse

def index(request):
# return redirect('https://www.shiguangkey.com')
return HttpResponse('<h1 style="color:blue">This is my 1st django project!</h1>')

def login_view(request):
home_url = reverse('teacher:index')  # 将reverse方法中的变量值改为teacher:index,也就是app的名字后面跟着index。
return redirect(home_url)

II. 模板系统

Step1: 在项目根目录创建templates目录

Step2: 在项目文件夹crm中找到settings.py模块,在其中找到TEMPLATES的函数,在’DIRS’:[]中做一个路径拼接,‘DIR’:[os.path.join(BASE_DIR,‘templates’)],代码如下:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],    #输入路径拼接
'APP_DIRS': Tru
20000
e,
'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',
],
},
},
]

Step3: 在templates目录下创建teacher目录,再在该目录内创建index.html文件,打开html文件,在body标签下,新增h1标签并输入一段文字,并且给该段h1标签的文字设置一下格式:

<h1 style="color:gold;">This is the homepage of Django Framework Term 7</h1>

也可以添加一张图片让显示的页面更美观些:

<img src="图片url链接" alt="">

Step4: 在项目crm目录中点views.py视图文件进行编辑,

写法一:

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
from django.template.loader import get_template    # 从django框架的template模块的loader模块中,导入get_template函数

def index(request):
t = get_template('teacher/index.html')
html = t.render()  # 设置变量html,传入t.render方法
return HttpResponse(html)

def login_view(request):
home_url = reverse('teacher:index')
return redirect(home_url)

写法二(简洁):

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
from django.template.loader import get_template    # 从django框架的template模块的loader模块中,导入get_template函数

def index(request):
return render(request,'teacher/index.html')

def login_view(request):
home_url = reverse('teacher:index')
return redirect(home_url)

运行之后,用浏览器访问127.0.0.1:8000/teacher/login/模块

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: