2010-04-17 56 views
1

我在網上搜索的方式來輕鬆讓用戶消除他們已設置在管理員的imagefield/filefields。Django管理員:添加一個「刪除文件」字段的圖像或FileField

我發現這個: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其中已經有一個BlahAdmin

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 

當我運行它,我得到的錯誤

maximum recursion depth exceeded while calling a Python object

在這一行:

object = super(self.__class__, self).save(*args, **kwargs) 

當我想它了一下,似乎很明顯,這只是無限自稱導致錯誤。我的問題是我不知道什麼是我應該這樣做的正確方法。 有什麼建議嗎?

的要求的其他信息:的blah

型號:

class Blah(models.Model): 
    blah_name = models.CharField(max_length=25, unique=True) 
    slug = models.SlugField() 
    img01 = models.ImageField(upload_to='scenes/%Y/%m', blank=True) 

    def __unicode__(self): 
     return self.blah_name 
+0

調用超級方法看起來不錯,你確定沒有更多或不同的代碼?也代替'object'使用'obj' – 2010-04-17 05:05:23

+0

感謝提示使用obj。 我不知道是否應該有更多的代碼,這就是所有鏈接。鏈接上的評論者可能會認爲有人閱讀過django/python比我更精通,缺少的位是顯而易見的? – 2010-04-17 17:44:51

回答

0

我測試我的機器上,它工作:-)。我完全使用你的一段代碼。 該問題必須在本代碼之外。

請發表一個片段,你如何調用/保存表格和Blah的聲明。

你覆蓋了的保存方法嗎?Blah

+0

您好maersu,感謝您的關注。我同意它聽起來像代碼之外的東西。 我沒有做任何特殊的調用窗體,我只是在django管理員中使用它。我不會覆蓋模型Blah的保存方法。我已經把模型放在了上面。 – 2010-04-29 08:33:56

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,所以A.m調用自己而不是調用基類的方法。這導致無限遞歸。

+0

嘿丹尼斯, 感謝您的回答。昨天我試過了: ** obj = super(BlahModelForm,self).save(\ * args,\ ** kwargs)**並且這個按預期工作。考慮一下,它不應該和使用** super(self。\ __ class \ __,self).save(\ * args,\ ** kwargs)**一樣嗎?在第一個例子中,我似乎明確地調用了我所在類的名稱,而不是通過** self。\ __ class \ __ **。有什麼明顯的我在這裏失蹤? – 2010-05-01 05:38:16

+1

當您在BlahModelForm的方法中使用self .__ class__時,不能保證給您BlahModelForm。 self可以是不同類的實例(特別是BlahModelForm的子類/派生類)。丹尼斯的例子說明了這種情況。 – zlovelady 2010-05-03 07:08:45

相關問題