Django的url与视图

URL命名

URL可能是经常在变化的,如果将视图路由名写死,当URL发生变化时,就不得不进行大量的修改,我们可以定义path的name参数,它是用来给这个路由起名字的,当在视图函数中需要反转的时候,可以reverse(name),它就会自动将name反转为对应的url

path 函数的定义为: path(route,view,name=None,kwargs=None) 。以下对这几个参数进行讲解。

  1. route 参数: url 的匹配规则。这个参数中可以指定 url 中需要传递的参数,比如在访问文章详情页的时候,可以传递一个 id 。传递参数是通过 <> 尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的 id 都是 int 类型,那么可以这样写 int:id ,以后匹配的时候,就只会匹配到 id 为 int 类型的 url ,而不会匹配其他的 url ,并且在视图函数中获取这个参数的时候,就已经被转换成一个 int 类型了。其中还有几种常用的类型:
    str:非空的字符串类型。默认的转换器。但是不能包含斜杠。
    int:匹配任意的零或者正数的整形。到视图函数中就是一个int类型。
    slug:由英文中的横杠 - ,或者下划线 _ 连接英文字符或者数字而成的字符串。
    uuid:匹配 uuid 字符串。
    path:匹配非空的英文字符串,可以包含斜杠。

  2. view 参数:可以为一个视图函数或者是 类视图.as_view() 或者是 django.urls.include() 函 数的返回值。

  3. 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文件夹中寻找模板文件

  1. 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对象返回回去
  1. render:使用更加方便
from django.shortcuts import render

def index(request):
	return(request, "index.html")		# 直接将模板渲染成字符串和包装成HttpResponse对象一步完成

猜你喜欢

转载自blog.csdn.net/li8561191/article/details/85264461
今日推荐