Django admin:为Image-或FileFields添加“删除文件”字段

时间:2010-04-17 03:49:26

标签: python django django-admin django-forms django-models

我正在互联网上寻找一种方法,可以轻松地让用户删除他们在管理员中设置的图像字段/文件字段。

我发现了这个: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

2 个答案:

答案 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__Bsuper(self.__class__, self).m指的是同一方法A.m,因此{{1}调用自身而不是调用基类的方法。这导致无限递归。

答案 1 :(得分:0)

我已经在我的机器上测试了它的工作原理:-)。我使用了你的代码。 问题必须在此代码之外。

请发布一个片段,告诉您如何调用/保存表单以及模型 Blah 的声明。

您是否覆盖了Model Blah 的保存方法?