Django 类视图(Class-Based Views)深度小结
【摘要】 Django 类视图(Class-Based Views)深度小结——为什么写 LoginView.as_view(),405 又是怎么来的? 一、回顾:函数视图 vs 类视图函数视图def login(request): if request.method == 'GET': return HttpResponse('GET 页面') else: ...
Django 类视图(Class-Based Views)深度小结——为什么写 LoginView.as_view(),405 又是怎么来的?
一、回顾:函数视图 vs 类视图
- 函数视图
def login(request):
if request.method == 'GET':
return HttpResponse('GET 页面')
else: # POST
return HttpResponse('POST 数据')
- 类视图
from django.views import View
class LoginView(View):
def get(self, request): # 处理 GET
return HttpResponse('GET 页面')
def post(self, request): # 处理 POST
return HttpResponse('POST 数据')
二、路由写法与必须加小括号的原因
from myapp.views import LoginView
urlpatterns = [
path('login/', LoginView.as_view()), # ← 必须带 ()
]
• as_view() 是 类方法(@classmethod),返回一个闭包函数;
• 不带括号拿到的是方法本身,带括号才是 Django 需要的“真正的视图函数”。
• 报错 takes 1 positional argument but 2 were given 99% 是忘了写括号。
三、常见 HTTP 405 Method Not Allowed
• 原因:类里没有实现对应的小写方法(如 PUT、DELETE)。
• 解决:在类里补上同名方法即可。
• 缩进错误、方法名大小写写错也会触发 405。
四、速查表
| HTTP 方法 | 类视图方法名 | 未实现时返回 |
|---|---|---|
| GET | get() |
405 |
| POST | post() |
405 |
| PUT | put() |
405 |
| DELETE | delete() |
405 |
五、面向对象回顾
• 普通方法:def foo(self) —— 由 实例 调用。
• 类方法:@classmethod def bar(cls) —— 由 类 调用。
• 静态方法:@staticmethod def baz() —— 类或实例都能调用。
as_view() 正是 @classmethod,所以 LoginView.as_view() 合法。
六、今天必须背住的三句话
-
类继承
View,方法名小写。 -
路由里
类名.as_view()必须加括号。 -
405 先看方法名,再看缩进,最后看括号。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)