Django中基于函数的视图和基于类的视图以及路由传参
django中有两种视图函数的声明方式:基于函数,基于类
1. 基于函数
1. 使用query进行传参
路由传参,使用get方式进行传参时,也就是使用query的方式进行传参,类似于?name=‘zs’&age=12的方式。此时就可以使用视图函数中的requrest对象进行获取。注意:一般情况下我们的二级路由中后面都要带个反斜杠,如果有参数传递的话则不能带反斜杠,其他地方没有变化
# views.py
def index(request):
# 这里设置的是默认参数
name = request.GET.get('name', 'lisi')
age = request.GET.get('age', 22)
return HttpResponse(f'hello Django 当前参数中:name-{name},age-{age}')
# app01/urls.py
urlpatterns = [
path('v1', index)
]
# mysite/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('test/',include('app01.urls'))
]
# 此时urls地址 http://127.0.0.1:8000/test/v1?name=zs&age=34
2.使用params进行传参
第二种路由传参,使用url进行传参,也就是动态路由匹配,比如test/zs/22,这样的方式进行传递。如果使用这种方式的话,那么我们的参数就要在视图函数的参数中进行接收,之后在应用的url中进行配置
### views.py
def index(request,name,age):
return HttpResponse(f'hello Django 当前参数中:name-{name},age-{age}')
### app01/urls.py
urlpatterns = [
path('v1/<string:name>/<int:age>', index)
]
### mysite/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('test/',include('app01.urls'))
]
### 此时urls地址 http://127.0.0.1:8000/test/v1?name=zs&age=34
2. 基于对象
基于类的视图以class定义,而不是函数视图的def定义。使用类视图后可以将视图对应的不同请求方式以类中的不同方法来区别定义(get方法处理GET请求,post方法处理POST请求),相对于函数视图逻辑更清晰,代码也有更高的复用性。
# app01/views.py
from django.http import HttpResponse
from django.views.generic import View
class Test(View):
def get(self, request):
name = request.GET.get('name', '')
age = request.GET.get('age', 12)
return HttpResponse(f'the name is {name},age is {age}')
def post(self,request):
pass
#app01/urls.py
from django.urls import path
from .views import Test
urlpatterns = [
path('v1', Test.as_view()),
]
# 基于面向对象的好处就是我们可以不用再去判断request.method是post还是get来处理不同的请求