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

时间:2017-12-02 03:41:39

标签: django django-forms django-class-based-views django-crispy-forms

我有一个问题,我解决了但事实是我不明白如何告诉我有一些基本的东西我不知道。希望有人可以帮助我。

所以我有一个基于类的更新视图,带有内联formset。我使用脆弱的表单来渲染视图。下面的代码首先工作,然后由于某种原因,当我尝试在浏览器中加载更新页面时,它开始给我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)

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

1 个答案:

答案 0 :(得分:2)

if self.request.GET并不意味着“如果请求是GET” - 而if self.request.POST并不意味着“如果请求是POST”。他们分别在GET和POST字典上使用布尔运算符 - 而在Python中,如果它们是空的,那么它们是布尔值False,否则是True。

所以,你的调用实际上是在询问“请求是否有一些查询字符串参数”,无论请求是否为GET,这可能是也可能不是,并且“请求是否具有正文”,这不是如果是空POST,则为true。

如果您确实想要检查请求的类型,则应明确检查if request.method == 'GET'(或'POST')。