Django中看似奇怪的HTTP请求逻辑

Seemingly weird logic of HTTP requests in Django

我有一个问题已解决,但我不明白如何解决这一事实表明我缺少一些基本的东西。希望有人能帮助我。

所以我有一个基于 class 的带有内联表单集的更新视图。我使用脆皮形式来呈现视图。下面的代码首先工作,然后由于某种原因它开始给我 Management form missing 错误,当我试图在我的浏览器中加载更新页面时。

#views.py:
class CaveUpdateView(UpdateView):
    model=Cave
    form_class=CaveForm
    template_name='caves/cave_form.html'

    def get_context_data(self,**kwargs):
      context = super(CaveUpdateView, self).get_context_data(**kwargs)
      entrance_helper = EntranceFormSetHelper()
      context['entrance_helper'] = entrance_helper
      if self.request.GET:
        context['entrance_formset']=EntranceInlineFormSet(instance=self.object)
      else:
        context['entrance_formset']=EntranceInlineFormSet(self.request.POST, instance=self.object)

绞尽脑汁把get_context_data函数的最后4行改成这样,一切都解决了:

      if self.request.POST:
        context['entrance_formset']=EntranceInlineFormSet(self.request.POST, instance=self.object)
      else:
        context['entrance_formset']=EntranceInlineFormSet(instance=self.object)

所以我的问题是,这两个表达式怎么不等价?是否有其他类型的请求我以某种方式让我的浏览器通过刷新发送?

if self.request.GET 并不意味着 "if the request is a GET" - if self.request.POST 也不意味着 "if the request is a POST"。他们分别在 GET 和 POST 字典上使用布尔运算符 - 在 Python 中,如果字典为空则为布尔值 False,否则为 True。

因此,您的调用实际上是在询问 "does the request have some querystring parameters",无论请求是否为 GET,这可能是真的也可能不是,而 "does the request have a body" 对于空 POST.

如果你真的想检查请求的类型,你应该明确检查if request.method == 'GET'(或'POST')。