首页 > 解决方案 > Django 1.11 - CreateView - 无效表单引发不存在对象属性的错误

问题描述

Django 1.11,使用基于通用类的视图。

提交无效表单时,调用 super(CreateSupport, self).get_context_data(**kwargs) 引发

AttributeError:“CreateSupport”对象没有属性“对象”。

期望在表单上显示验证错误。

表单有效时查看/创建可以正常工作。

这是课程:

class CreateSupport(IsAdminMixin, CreateView):
model = Support
form_class = SupportForm
template_name = 'admin/support/form.html'
success_url = reverse_lazy('admin-supports')

def get_context_data(self, **kwargs):
    context = super(CreateSupport, self).get_context_data(**kwargs)
    if hasattr(self, 'object'):
        context['images_form'] = SupportForm.ProductImageFormSet(
            instance=self.object) if "validated_images_form" not in kwargs else kwargs["validated_images_form"]

    # filter the colour and size options for current vendor
    curr_vend = Vendor.objects.get(id=self.kwargs['vendorid'])
    context['colours'] = Colour.objects.filter(vendor=curr_vend)
    context['sizes'] = Size.objects.filter(vendor=curr_vend)
    return context

def form_valid(self, support_form):
    if support_form.is_valid():
        redirect = super(CreateSupport, self).form_valid(support_form)
    else:
        validated_forms_context = self.get_context_data(form=support_form)
        redirect = self.render_to_response(validated_forms_context)

    return redirect

def post(self, request, *args, **kwargs):
    support_form = SupportForm(data=request.POST)
    return self.form_valid(support_form)

到目前为止,除了使用 self.get_object() 方法的旧帖子之外,我找不到任何解决方案,由于尚未创建对象,因此显然无法正常工作。

追溯:

"C:\Program Files\JetBrains\PyCharm 2017.3.3\helpers\pydev\_pydevd_bundle\pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
  File "C:\ProgramData\Anaconda2\envs\django3.4\lib\site-packages\django\views\generic\edit.py", line 94, in get_context_data
    return super(FormMixin, self).get_context_data(**kwargs)
  File "C:\ProgramData\Anaconda2\envs\django3.4\lib\site-packages\django\views\generic\detail.py", line 101, in get_context_data
    if self.object:
AttributeError: 'CreateSupport' object has no attribute 'object'

标签: pythondjango

解决方案


在 Will Keeling 关于默认 post() 实现的评论之后,我联系了 BaseCreateView 类。

这是 post() 的默认实现:

def post(self, request, *args, **kwargs):
    self.object = None
    return super(BaseCreateView, self).post(request, *args, **kwargs)

因此,可以通过将 self.object 设置为 None 来简单地解决该问题。


推荐阅读