路由分配及模板渲染
路由系统
urlpatterns = [ path('admin/', admin.site.urls), path('teacher/',include('teacher.urls')) ]
根据path的顺序依次匹配路径,如果路径匹配则调用后面的方法
例如新建一个视图:
from django.http import HttpResponseZZZ def index_view(request): return HttpResponse('我是首页面')
添加路由:
from . import views urlpatterns = [ path('admin/', admin.site.urls), path('teacher/',include('teacher.urls')), path('index/',views.index_view) ]
运行结果:
参数说明:
path(route,view,kwargs=None,name=None)
- route是一个字符串(url规则)
- view是视图
- kwargs一个额外参数,是一个字典
- name url规则名字
在此简单说明一下kwargs参数:
一个额外的参数(字典类型):加入参数后,所指向的视图必须含有这俩个参数,不然会报错
列如:
#加入kwargs path('student_detail/<int:pk>/',views.student_detail_view,kwargs={'arg1'='value1','arg2'='value2',.....} #相应的视图也应加入参数 def student_detail_view(request,pk,arg1,arg2......): pass
特殊的,如果在include后面加入kwargs,则include所指向的urls文件里面所有指向的视图都需要kwargs参数
特别地:当额外参数与url参数起冲突的时候,以额外参数为准
在url中捕获参数
创建视图:
def student_detail_view(request,pk): return HttpResponse('学生ID为:%s的详情'%pk)
添加路由:(加入PK参数)
path('student_detail/<pk>/',views.student_detail_view)
运行成功:(显示内容会随着输入内容而改变,即捕获的参数)
转换器
path('student_detail/<int:pk>/',views.student_detail_view)
- str:匹配除了路径分隔符“/”之外的所有字符串,如果不写转换器,默认字符串转换器
- int:匹配0或任何正整数
- slug:匹配任意的ASCLL字符,或数字组成的slug字符串,连字符和下划线
- path:匹配任何非空字符串,包括路径分隔符‘/’
使用正则表达式——>加以限制条件
注意:正则表达式下匹配的参数都会转换成字符串
re_path(route,view,kwargs=None,name=None)
例如:
re_path(r'student_detail/(?P<pk>\d+)/',views.student_detail_view) #等同于上面的student_detail
映射应用的views(上面的是映射根目录里面的views)
使用include(可有多级)
path('teacher/',include('teacher.urls'))
即:把以teacher开头的匹配截取,把后面的部分拿到teacher.urls里面进行路由匹配(即子路由【应用里面的路由】)
url命名
重定向,redirect方法
例如:使用redirect重定向之后,输入地址后会跳转到百度网址
def my_redirect(request): return redirect('https://www.baidu.com')
同样可以跳转项目内的其他地址:
例如:
def index(request): return HttpResponse('这是第一个Django项目,老师端!') def login_views(request): return redirect('/teacher/index')
则会跳转到index(发生了跳转):
注意:如果像以上这样使用redirect会导致编码死板,可维护性差,在项目里面如果路径一旦修改则难以维护代码
使用name参数解决:
#路由部分: path('index/',views.index,name ='index') #views部分: def login_views(request): home_url = reverse('index') return redirect(home_url)
reverse('name')里面参数填写url的命名,赋予变量home_url(自定义名字),redirect()里面使用变量,当路由的'index/',变换名字之后,视图里面不需要更改,reverse()会自动获取新的地址
另外注意:
当多个应用里面的url的name相同的时候,在每个应用的urls.py下设置一个app_name = '应用名'(应用名不重复)
#urls.py下设置app_name app_name = 'teacher' #相应的views.py下也要做出更改 def login_views(request): home_url = reverse('teacher:index') return redirect(home_url) #reverse('应用名:url名')
模板系统
在项目文件夹下的settings.py里面
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ]
'DIRS': []
:配置模板路径
在项目根目录下新建一个文件(规范名:templates)
settings.py下的BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
代表的是项目路径,所以要进行拼接
'DIRS': [os.path.join(BASE_DIR,'templates')],
Django就回到templates下查找模板文件
再在templates下创建对应的app名字的文件夹(举例teacher),在teacher下创建html文件
使用html
导入模块from django.template.loader import get_template
使用get_template()获取html文件,并且解析
def index(request): t = get_template('teacher/index.html') html = t.render() return HttpResponse(html)
运行成功:
另外直接使用render()方法更加简洁:
def index(request): return render(request,'teacher/index.html') #等同于上面的写法
来源:https://www.cnblogs.com/pygive/p/10601084.html