我具有以下表单的Django代码(django版本1.11):
class MyDocumentUpdateView(UpdateView):
""" We extend UpdateView as we need to pass self.object in context as resource """
model = MyDocument
def get_context_data(self, **context):
context[self.context_object_name] = self.object
context['resource'] = self.object
#context['form'] = self.get_form() <-- if I uncomment this it works
return context
class DocumentUpdateView(MyDocumentUpdateView):
form_class = MyDocumentForm
def form_valid(self, form):
doc = form.save(commit=False)
doc.owner = self.request.user
updateMyDocument(doc, form)
return HttpResponseRedirect(
reverse(
'mydocs_detail',
args=(
self.object.slug,
)))
运行此代码时,出现错误:
'str' object has no attribute 'fields'
我意识到此错误与 context 变量的返回有关。由于某种原因,上下文词典不包含“表单”。如in the documentation所示:
get_context_data(**kwargs)¶
Calls get_form() and adds the result to the context data with the name ‘form’.
但是在我的情况下,上下文词典不包含“表单”。
如果我使用get_form()def,则一切正常:
context['form'] = self.get_form()
但这对我来说似乎是一个过大的杀手,我想更深入地研究为什么它不起作用。
然后我注意到我使用的是:
def get_context_data(self, **context):
而不是:
def get_context_data(self, **kwargs):
因此,我将上下文定义如下:
context = super(DocumentUpdateView, self).get_context_data(**kwargs)
但是随后出现以下错误:
maximum recursion depth exceeded
答案 0 :(得分:1)
因此,我将上下文定义如下:
context = super(DocumentUpdateView, self).get_context_data(**kwargs)
您使用了错误的类,因为您在MyDocumentUpdateView
级别上调用了它,所以它应该是super(MyDocumentUpdateView, self).get_context_data(**kwargs)
。因此,您应将其实现为:
class MyDocumentUpdateView(UpdateView):
""" We extend UpdateView as we need to pass self.object in context as resource """
model = MyDocument
def get_context_data(self, **kwargs):
context = super(MyDocumentUpdateView, self).get_context_data(**kwargs)
context['resource'] = self.object
return context
话虽如此,self.object
已经添加到上下文中,默认情况下作为模型名称(因此此处为mydocument
,您可以通过指定自己指定一个context_object_name
属性的值,例如:
class MyDocumentUpdateView(UpdateView):
""" We extend UpdateView as we need to pass self.object in context as resource """
model = MyDocument
context_object_name = 'resource'
在这种情况下,上下文当然不再具有以其模型名称(或任何其他名称)存储的对象。