0
点赞
收藏
分享

微信扫一扫

Django 2.1.7 类视图

Django 2.1.7 类视图_html


相关篇章

​​Django 2.1.7 创建应用模板​​​​Django 2.1.7 配置公共静态文件、公共模板路径​​​​Django 2.1.7 模板语言 - 变量、标签、过滤器、自定义过滤器、模板注释​​​​Django 2.1.7 模板继承​​​​Django 2.1.7 模板 - HTML转义​​​​Django 2.1.7 模板 - CSRF 跨站请求伪造​​​​Django 2.1.7 模板 - 图片验证码的实现​​​​Django 2.1.7 模板 - 动态URL 反向解析​​​​Django 2.1.7 模板 - 动态配置静态文件路径​​

参考文献

​​https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial04/#use-generic-views-less-code-is-better​​​​https://docs.djangoproject.com/zh-hans/2.1/ref/class-based-views/generic-display/#django.views.generic.list.ListView​​

需求问题

让我们带着问题来思考并熟悉一下这个类视图。

  • 同一个​​url​​​路径能否同时处理​​get​​​和​​post​​​请求呢?是否可以通过​​request.method​​来判断请求类型,然后拆分出来呢?
  • 如果采用这种​​request.method​​​的​​if​​判断方式,这样就会导致代码结构不清晰,可以怎么做呢?

下面来构建一下这个场景。

构建一个url路径同时处理get和post请求

1) 首先在应用的​​view.py​​​中创建两个视图​​test_method​​​和​​test_method_handle​

def test_method(request):
return render(request,'assetinfo/test_method.html')

def test_method_handle(request):
if request.method == 'GET':
return HttpResponse("this is get request!")
if request.method == 'POST':
return HttpResponse("this is post request!")

2)配置urls路径

from django.urls import path, re_path
from . import views

app_name = 'assetinfo' # 设置命名空间

urlpatterns = [
# ex:/assetinfo/test_method
path('test_method', views.test_method, name='test_method'),
# ex:/assetinfo/test_method_handle
path('test_method_handle', views.test_method_handle, name='test_method_handle'),
]

3)在​​templates​​​创建模板​​test_method.html​

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'assetinfo:test_method_handle' %}" method="post">
{% csrf_token %}
<input type="submit" value="提交post请求">
</form>
</body>
</html>

4)首页直接发送一个get请求,来测试​​test_method_handle​​​处理​​get​​方法,如下:


Django 2.1.7 类视图_django_02


5)通过访问​​test_method.html​​​来发送一个post请求,测试​​test_method_handle​​​处理​​post​​方法


Django 2.1.7 类视图_html_03


发送post请求,如下:


Django 2.1.7 类视图_django_04


从上面的测试结果来看,​​http://127.0.0.1:8000/assetinfo/test_method_handle​​可以同时处理get和post请求了。

这是采用​​if​​判断的方法。这样的写法结构比较麻烦,下面来改写使用类视图的方式来处理。

改为类视图

1) 修改​​test_method_handle​​方法为类方法。

from django.views.generic import View

class TestMethodHandle(View):

def get(self, request):
return HttpResponse("this is get request!")

def post(self, request):
return HttpResponse("this is post request!")

2) 修改​​urls.py​​的路径配置

from . import views
from .views import TestMethodHandle

urlpatterns = [
# ex:/assetinfo/test_method_handle
path('test_method_handle', TestMethodHandle.as_view() , name='test_method_handle'),

3) 测试发送​​get​​请求,如下:


Django 2.1.7 类视图_post请求_05


4) 测试发送​​post​​请求,如下:


Django 2.1.7 类视图_django_06


发送post请求如下:


Django 2.1.7 类视图_post请求_07


可以从结果来看到,导入​​from django.views.generic import View​​的类视图之后,就可以直接编写不同的方法来处理不同的业务。

查看View类视图源码


Django 2.1.7 类视图_post请求_08


http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

从源码来看,继承​​View​​​类不单单可以处理​​get​​​和​​post​​方法,还可以处理其他类型的请求。


Django 2.1.7 类视图_post请求_09


举报

相关推荐

0 条评论