2010-04-17 2 views
1

관리자가 설정 한 imagefield/filefield를 쉽게 비울 수있는 방법을 찾기 위해 인터넷에서 사냥하고있었습니다.Django admin : Image- 또는 FileFields에 대해 "파일 제거"필드를 추가하십시오.

이 항목을 찾았습니다 : http://www.djangosnippets.org/snippets/894/. 이미 있었다 나는 내 자신의 형식에서 사용하려고하면

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이 추가 : 나에게 정말 흥미로웠다 무엇

여기 rfugger에 의해 코멘트에 게시 코드이었다 a BlahAdmin.

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

나는 조금 그것에 대해 생각, 단지 무한히 것을 분명 같다 : 나는 그것을 실행하면

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

를 얻을 수 오류를 일으키는 자체를 호출합니다. 내 문제는 내가이 일을해야하는 올바른 방법이 무엇인지 알 수 없다는 것입니다. 제안 사항이 있으십니까? 요청에 따라

추가 정보 : 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

수퍼 메소드를 호출하는 것이 좋습니다. 더 많거나 다른 코드가없는 것이 확실합니까? 또한 '객체'대신 'obj'를 사용하십시오. –

+0

팁이 obj를 사용해 주셔서 감사합니다. 코드에 더 많은 코드가 있어야하는지는 모르겠다. 링크에있는 것이 전부다. 링크의 주석 작성자는 내가 읽고있는 사람이 장고/파이썬에서 더 능숙하다는 것과 그 누락 된 비트가 명백하다고 가정하고있을 것입니다. –

답변

0

내 컴퓨터에 그것을 테스트 한 :-) 작동합니다. 코드 조각을 정확히 사용했습니다. 문제는이 코드 외부에 있어야합니다.

양식을 신고하고 모델을 신고하는 방법을 알려주세요. .

모델 의 저장 방법을 덮어 썼습니까??

+0

안녕하세요, 관심을 가져 주셔서 감사합니다. 나는 코드 밖에서 뭔가 소리가 나는 것에 동의한다. 양식을 호출하는 데 특별한 조치를 취하지 않습니다. 장고 관리에서 사용하고 있습니다. Model Blah의 save 메소드를 덮어 쓰지 않습니다. 위의 blah 모델을 덮어 씁니다. –

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 

이의는 무슨 일이 일어나고 있는지 보자. B 인스턴스의 경우 A.m 메서드를 호출하므로 self.__class__B이고 super(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 \ __ **를 (를) 통해 진행하는 대신 명시 적으로 내가 속한 클래스의 이름을 호출하는 것처럼 보입니다. 내가 여기서 빠진 뭔가 분명해? –

+1

BlahModelForm의 메소드에서 self .__ class__를 사용하면 BlahModelForm을 제공한다고 보장 할 수 없습니다. self는 다른 클래스 (특히 BlahModelForm의 자식/파생 클래스)의 인스턴스가 될 수 있습니다. 이것이 데니스의 사례가 보여주는 상황입니다. – zlovelady