2012-04-12 3 views
1

모델 인스턴스를 추가하고 저장시 닫으려면 장고 관리자 내에 새 창을 여는 코드를 작성하고 있습니다. 이는 ForeignKey 필드 add (녹색 더하기 부호)의 동작과 매우 유사하지만 새로 작성된 모델 인스턴스를 선택하지 않습니다 (외래 키 필드가 아니기 때문에).save_model을 오버라이드하고 창을 닫으십시오.

나는 팝업 링크를 만들기 위해 추가하는 코드는 다음과 같습니다 내 모델이 이벤트라고

link = '<a id="add_id_event" class="add-another" onclick="return showAddAnotherPopup(this);" href="%s?date=%s">add</a>' % (addurl,currentdate) 

. RelatedObjectLookups.js를 올바르게 추가합니다.

이 모델을 저장하려고하면 django는 ForeignKey 필드에서 사용할 코드와 동일한 코드를 적용하고 내가 가지고 있지 않은 SelectBox를 활성화하려고 시도합니다. 이것은이 코드가 사용되지만 HttpResponse에 호출이 무시 장고가 렌더링되는

def save_model(self, request, obj, form, change): 
    if request.GET.get('_popup') == '1': 
     obj.save() 
     return HttpResponse('<script type="text/javascript">window.close()</script>') 

와 save_model 기능을 무시하려고 한 window.close()

에 도달하기 전에 실패 자바 스크립트의 원인 태만. 예 :

<script type="text/javascript">opener.dismissAddAnotherPopup(window, "14382", "TMC 2012\u002D02\u002D02 10:00:00 DDT2010B\u002D028");</script> 

대상 SelectBox 개체가 없으므로 실패합니다.

도움 주셔서 감사합니다.

+0

ModelAdmin에서 'save_model'대신 'add_view'를 재정의하십시오. 나는'save_model'가'HttpResponse'를 반환 할 것으로 생각하지 않습니다. – ilvar

답변

3

ModelAdmin.response_add을 재정의해야합니다. 그것은 리디렉션이 일어나는 곳입니다.

내 경우에는 dismissAddAnotherPopup 메서드를 재정의해야하므로 멋진 M2M 위젯을 처리하기 위해 dismissAddAnotherPopupWithUpdate라는 새 메서드를 만들었습니다. 여기 내가 사용하는 코드는 다음과 같습니다

def response_add(self, request, obj, post_url_continue='../%s/'): 
    """ 
    Overriding to force the widget to update 
    """ 
    resp = super(ModelAdmin, self).response_add(request, obj, post_url_continue) 
    if request.POST.has_key("_popup"): 
     return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopupWithUpdate(window, "%s", "%s");</script>' % \ 
      # escape() calls force_unicode. 
      (escape(obj._get_pk_val()), escape(obj))) 
    return resp 
+0

부모 페이지를 새로 고치려면 스크립트에'opener.location = opener.location.pathname;'을 추가하십시오. Opener는 부모 창에 대한 참조입니다. – simno

0

카리의 솔루션은 확실히 작동하지만,이에 대한 간단한 솔루션이 <a> 태그에 유효한 ID를 지정하는 것입니다. id를 사용하면 dismissAddAnotherPopup()이 창을 닫은 후 적절한 필드를 선택할 수 있습니다. window.close()이 존재하는 한 어떤 ID를 지정해도 문제가 없습니다.

관련 문제