URL命名
URL可能是经常在变化的,如果将视图路由名写死,当URL发生变化时,就不得不进行大量的修改,我们可以定义path的name参数,它是用来给这个路由起名字的,当在视图函数中需要反转的时候,可以reverse(name),它就会自动将name反转为对应的url
path 函数的定义为: path(route,view,name=None,kwargs=None) 。以下对这几个参数进行讲解。
route 参数: url 的匹配规则。这个参数中可以指定 url 中需要传递的参数,比如在访问文章详情页的时候,可以传递一个 id 。传递参数是通过 <> 尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的 id 都是 int 类型,那么可以这样写 int:id ,以后匹配的时候,就只会匹配到 id 为 int 类型的 url ,而不会匹配其他的 url ,并且在视图函数中获取这个参数的时候,就已经被转换成一个 int 类型了。其中还有几种常用的类型:
str:非空的字符串类型。默认的转换器。但是不能包含斜杠。
int:匹配任意的零或者正数的整形。到视图函数中就是一个int类型。
slug:由英文中的横杠 - ,或者下划线 _ 连接英文字符或者数字而成的字符串。
uuid:匹配 uuid 字符串。
path:匹配非空的英文字符串,可以包含斜杠。view 参数:可以为一个视图函数或者是 类视图.as_view() 或者是 django.urls.include() 函 数的返回值。
name 参数:这个参数是给这个 url 取个名字的,这在项目比较大, url 比较多的时候用处 很大。
比如在front/views.py中
from django.http import HttpResponse
from django.shortcuts import redirect, reverse
def index(request):
username = request.GET.get("username")
if username:
return HttpResponse("这是首页")
else:
return redrect(reverse("login"))
def log_in(request):
return HttpResponse("这是登陆页面")
front/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("signin/", views.log_in, name="login")
]
如果没有得到用户名,可以在index视图函数中通过reverse(“login”)("login"就是在定义url匹配中第二条规则设置的name参数,它对应signin/这个url)反转出log_in函数的url,之后用redirect重定向到跳转到signin/所对应的视图函数
app应用命名空间
应用命名空间通常用来区分多个app,app_name定义在各个app的urls.py文件中,有时候多个app的urls匹配中可能会有相同的name值,这时候就可以用app_name来区分
front/urls.py
app_name = "front"
urlpatterns = [ "signin/", views.log_in, name="login"]
cms/urls.py
app_name = "cms"
urlpatterns = [ "signin/", views.log_in, name="login"]
front/views.py
def index(request):
# 此时就可以通过使用应用名来说明是front下的login
return redirect(reverse("front:login"))
模板渲染
在项目的settings.py文件中,有一个TEMPLATES的配置,这个配置中有一项是DIRS,这是一个列表,在列表中加上"templates",django就会在templates文件夹中寻找模板文件
- render_to_string:渲染模板
from django.template.loader import render_to_string
from django.http import HttpResponse
def index(request):
html = render_to_string("index.html") # 首先找到模板文件
return HttpResponse(html) # 之后包装成HttpResponse对象返回回去
- render:使用更加方便
from django.shortcuts import render
def index(request):
return(request, "index.html") # 直接将模板渲染成字符串和包装成HttpResponse对象一步完成