2012-04-12 11 views
1

モデルインスタンスを追加して保存を閉じるには、django管理者の中に新しいウィンドウを開くコードを書いています。これは、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をアクティブにしようとします。これはjavascriptのが失敗することははwindow.close()

に到達する前に、私はこのコードが使用されているが、HttpResponseの呼び出しは無視され、Djangoがレンダリングされ

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関数をオーバーライドしようとしましたデフォルト。例えば

<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は問題ではありません。

関連する問題