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)