Django 类视图(Class-Based Views)深度小结

举报
周杰伦本人 发表于 2025/08/31 20:53:38 2025/08/31
【摘要】 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 类视图

  1. 函数视图
def login(request):
  if request.method == 'GET':
      return HttpResponse('GET 页面')
  else:                          # POST
      return HttpResponse('POST 数据')
  1. 类视图
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() 合法。

六、今天必须背住的三句话

  1. 类继承 View,方法名小写。

  2. 路由里 类名.as_view() 必须加括号。

  3. 405 先看方法名,再看缩进,最后看括号。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。