我正在互联网上寻找一种方法,可以轻松地让用户删除他们在管理员中设置的图像字段/文件字段。
我发现了这个:http://www.djangosnippets.org/snippets/894/。
我真正感兴趣的是 rfugger 在评论中发布的代码:
remove_the_file = forms.BooleanField(required=False)
def save(self, *args, **kwargs):
object = super(self.__class__, self).save(*args, **kwargs)
if self.cleaned_data.get('remove_the_file'):
object.the_file = ''
return object
当我尝试以自己的形式使用此功能时,我基本上将其添加到已经有admin.py
的{{1}}。
BlahAdmin
当我运行它时,我收到错误
调用Python对象时超出了最大递归深度
在这一行:
class BlahModelForm(forms.ModelForm):
class Meta:
model = Blah
remove_img01 = forms.BooleanField(required=False)
def save(self, *args, **kwargs):
object = super(self.__class__, self).save(*args, **kwargs)
if self.cleaned_data.get('remove_img01'):
object.img01 = ''
return object
当我考虑一下时,很明显它只是无限地调用自己导致错误。我的问题是我无法弄清楚我应该这样做的正确方法。 有什么建议吗?
要求的其他信息:
object = super(self.__class__, self).save(*args, **kwargs)
的模型:
blah
答案 0 :(得分:3)
永远不要使用super(self.__class__, self)
!请尝试以下示例:
class A(object):
def m(self):
super(self.__class__, self).m()
class B(A): pass
B().m()
它将失败并出现同样的错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in m
... repeated a lot of times ...
RuntimeError: maximum recursion depth exceeded while calling a Python object
让我们看看发生了什么。您为A.m
个实例调用了B
方法,因此self.__class__
为B
而super(self.__class__, self).m
指的是同一方法A.m
,因此{{1}调用自身而不是调用基类的方法。这导致无限递归。
答案 1 :(得分:0)
我已经在我的机器上测试了它的工作原理:-)。我使用了你的代码。 问题必须在此代码之外。
请发布一个片段,告诉您如何调用/保存表单以及模型 Blah 的声明。
您是否覆盖了Model Blah 的保存方法?