【问题标题】:Why is my class-based view only working with GET?为什么我的基于类的视图只能使用 GET?
【发布时间】:2020-04-26 17:33:59
【问题描述】:

我想问一个问题,但我自己找到了答案并想在这里分享。也许有人甚至可以告诉我发生了什么。

我像以前一样创建了一个 UpdateView 子类。但是,当我通过一个属于 method=post 表单的按钮进入该页面时,我只得到一个空表单。快把我逼疯了。最后,我偶然发现,当我在地址栏中再次输入 URL 时,会从数据库中接收到值。我使用按钮将表单从发布更改为获取,当我现在单击它转到 UpdateView 页面时,它可以工作。但老实说,我不知道为什么。 CVB 对我来说仍然很神秘;)

【问题讨论】:

  • GET 请求不应该从数据库中创建/更新/删除数据。 GET 请求应该有没有副作用。
  • 亲爱的威廉,谢谢。但是你能告诉我为什么会这样吗?
  • 因为它是这样设计的 (en.wikipedia.org/wiki/…): "GET 方法请求指定资源的表示。使用 GET 的请求应该只检索数据并且应该没有其他效果。(其他一些 HTTP 方法也是如此。)[1] W3C 已经发布了关于这种区别的指导原则,说:“Web 应用程序设计应该遵循上述原则,但也应该遵循相关限制。"[24]."
  • 谢谢。我认为这会有一些安全原因。

标签: django python-3.x django-views


【解决方案1】:

你会做一个很棒的应用程序,你很接近,下面是一个例子,你需要定义 POST 和 GET 方法,默认情况下基于类的视图使用 GET 函数

class profile(APIView):

    def get(self, request):
        profile = Profile.objects.get_or_create(user=request.user)
        return Response()

    def post(self, request):
        mydata = request.POST
        return redirect('/accounts/profile/')

【讨论】:

  • 谢谢。我必须在我的views.py中声明他吗?那我该如何访问 mydata 呢?例如,如果我有 request.POST['foo'],我会使用 mydata['foo'] 吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 2012-03-23
  • 2022-12-16
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多