【问题标题】:Handling POST data in django forms处理 Django 表单中的 POST 数据
【发布时间】:2016-06-23 19:52:38
【问题描述】:

在表单视图中处理 POST 数据时,以下两种方法有什么区别(如果有):

1.

def form_view(request):
    form = MyForm(request.POST or None)
    if form.is_valid():
        # handle POST data here

2.

 def form_view(request):
     if request.method == "POST":
         form = MyForm(request.POST)
         if form.is_valid():
             # handle POST data here
     else:
         form = MyForm()

【问题讨论】:

  • 无论哪种方式,如果您正在使用表单,那么您最好使用django's Editing Views,这会使这个问题变得无声。
  • @sayse 基于类的视图不会自动优于基于函数的视图。即使您选择在任何地方都使用 cbvs,您仍然可能会在其他人的代码中遇到 request.POST or None 技巧,因此了解它的工作原理很有用。
  • @Alasdair - 我同意这有助于理解它们的工作方式。当您开始需要使用“if method = x”(或 post 或 none)行开始您的视图时,CBV(在我看来)会发挥作用,逻辑分离使代码更清晰,CBV 会自动停止禁止的 http 请求等。

标签: django forms post


【解决方案1】:

使用request.POST or None 是一种快捷方式,用于缩短视图(尽管如果您以前没有看过该技术,则更难理解)。熟悉这个技巧很有用,因为你会在其他人的代码中遇到它。大多数情况下,无论您采用哪种方法,视图都会发挥同样的作用。但是,也有一些极端情况,所以最安全的方法是避免这个技巧。

这个技巧有效,因为request.POST 是 GET 请求的空字典。这意味着:

  • 对于 get 请求,request.POST or None 等效于 {} or None,其计算结果为 None。
  • 对于发布请求,request.POST or None 的计算结果为 request.POST,只要发布请求不为空。

因此,您可以使用MyForm(request.POST or None),而不必在两个分支中都包含 if 语句并实例化表单。

request.POST 为空时,post 请求会出现边缘情况。这是不寻常的,但可能会发生,例如,如果表单仅包含复选框,而您在提交时未选中任何复选框。

【讨论】:

    【解决方案2】:

    request.POST or None - 如果 request.POST 不为空(所以它是 POST 请求),则将数据传递给表单,否则它将传递 None(并且 for 将以与 MyForm() 相同的方式操作)。

    如果没有任何内容传递给 from,它将无效,但不会同时发生错误。

    如果将某些内容传递给表单但数据无效,is_valid() 也将返回 False,但在 form.errors 下将放置引发错误。

    长话短说,这种方式可以让你以更简洁、更优雅的方式编写代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多