2012-02-10 4 views
1

사용자가 특정 유형 (예 : 테이블의 마지막 행)의 마지막 객체를 삭제하지 못하게 할 수있는 방법이 있습니까? 사용자는 이러한 종류의 개체를 일반적으로 삭제할 수 있어야하지만, 적어도 하나의 항목이 남아 있어야합니다.이 경우에는 사용자와 관련된 항목이 하나 이상 있어야합니다. Django 관리자의 경우 마지막 객체 유형 삭제를 방지하는 방법

나는 모델의 삭제 기능을 재정의하는 시도 :

def delete(self, *args, **kwargs): 
    others = Presentation.objects.filter(user=self.user).exclude(pk=self.pk) 
    if len(others) < 1: 
     pass 
    else: 
     super(Presentation, self).delete(*args, **kwargs) 

이 작동을하지만, 사용자는 삭제가 실제로 성공했는지 이야기한다. 유효성 검사가 실패 할 때와 같이 오류 메시지가 표시되는 것을 좋아합니다. 그러나 유효성 확인은 내가 알 수있는 한 저장할 때만 적용됩니다.

답변

2

시도해 주시겠습니까?

# admin.py 
class MyModelAdmin(admin.ModelAdmin): 
    def delete_model(self, request, obj): 
     if last_record: 
       storage = messages.get_messages(request) 
       storage.used = True 
       messages.error(request, 'Cannot delete last record.') 
     else: 
       obj.delete() 

또 다른 옵션으로 jQuery를 사용하여 성공 메시지 div 또는 span을 숨길 수 있습니다.

+0

이것은 작동하지 않습니다. 'clean()'은 save에서 명시 적으로 호출되지만 delete에서는 호출되지 않습니다. – pholz

+0

그래 맞아. 삭제시 아무 것도 정리할 이유가 없습니다. 내 잘못이야. –

+0

내 대답을 업데이트했습니다 –

1

내가 당신에게 다른 방법 제안 : pre_delete와 당신의 상태에 올리고 예외

1) 생성 및 신호를 연결합니다

def on_delete(sender,**kwargs): 
    if <condition>: 
     raise Exception('Abort delete') 
    #else: continue and delete 

pre_delete.connect(on_delete,sender=Presentation) 

2) 그런 다음보기에, 당신이 잡을 수 이 예외

# view code... 
try: 
    object.delete() 
except: 
    # add the desired info to context 

어쨌든, 당신은 또한 예외를 던져 뷰 코드를 잡으려고 model::delete을 대체 할 수 있습니다.

+0

"보기에서"무엇을 의미합니까? 나는 사용자 정의보기를 사용하지 않지만 내장 된 장고 관리자보기 및 기본 제공 템플릿을 사용합니다. 이 사용자 지정보기를 작성하고이 사용자 지정 서식 파일을 사용해야합니까? – pholz

+0

** **보기 및 템플릿이 내장 된 관리자 만 ** 이것을 사용하는 경우 관리 템플릿에 양식 오류가 이미 표시되어 있으므로 dan-klasson의 접근 방식이 더 좋습니다. 그러나주의해서 다른 삭제 작업 이 관리자 양식을 통해서는 귀하의 상태를 확인하지 않습니다 : S – jgsogo

관련 문제