python - 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'
解决方案
在 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 来简单地解决该问题。
推荐阅读
- objective-c - 有没有办法将两个元素添加到单个 UITableView 行
- javascript - 使用 ReactHooks 和 React.state 在本地存储中存储对象数组
- wordpress - WooCommerce 登录“以访客身份继续”按钮网关
- javascript - 在纯javascript之外单击时删除侧边菜单
- google-apps-script - 连接工作表不能以宏或脚本为目标
- google-cloud-platform - 如何将 GCP VM“机器映像”导出到 GCP 存储
- vue.js - 通过 props Vue 更改 activetab
- entity-framework-6 - 如何在 ADO.NET + EF6 + WCF DataService 5.6 上设置超时?
- qt - 为什么 QAbstractScrollArea 的视口小部件没有绘制?
- cifilter - CISmoothLinearGradient 过滤器崩溃