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'
)。
我有一个问题已解决,但我不明白如何解决这一事实表明我缺少一些基本的东西。希望有人能帮助我。
所以我有一个基于 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'
)。