Администратор Django: Добавить поле «Удалить файл» для Image- или FileFields - PullRequest
1 голос
/ 17 апреля 2010

Я искал по Интернету способ, позволяющий пользователям легко убирать поля изображений / файлов, которые они установили в админке.

Я нашел это: 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

Когда я запускаю его, я получаю сообщение об ошибке

превышена максимальная глубина рекурсии при вызове объекта Python

в этой строке:

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

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

Никогда не используйте 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, поэтому A.m вызывает себя вместо вызова метода базового класса. Это приводит к бесконечной рекурсии.

0 голосов
/ 23 апреля 2010

Я проверил его на своей машине, и он работает :-). Я использовал именно ваш кусок кода. Проблема должна быть за пределами этого кода.

Пожалуйста, отправьте фрагмент, как вы звоните / сохраните форму и объявление модели Бла .

Вы перезаписали метод сохранения модели Бла ?

...