17

ユーザーのワークフローと非常によく似た Django admin のモデルのワークフローがあります。まず、基本的なフィールドを含むフォームを作成し、次に残りのデータを含む 2 つ目のフォームを作成します。

auth.user と同じワークフローです

ユーザーがワークフローを壊さないように、「保存して続行」ボタンと「保存して別の追加」ボタンを削除する必要があります。

私はそれをextra_contextとして追加しようとしました

extra_context = {
  'show_save_and_add_another': False,
  'show_save_and_continue': False
}

ModelAdmin.add_view または ModelAdmin.change_view を介して渡しますが、機能しません。

これは 1 つのモデルのためだけなので、submit_line.html から削除したくありません。

手がかりや別の方法はありますか?

前もって感謝します

4

3 に答える 3

16

その (少しぎこちない) ハッキング スタイルに加えて、テンプレート タグを直接オーバーライドすることもできます。通常は、テンプレートをオーバーライドすることをお勧めします。

# put this in some app such as customize/templatetags/admin_modify.py and place the app
# before the 'django.contrib.admin' in the INSTALLED_APPS in settings

from django.contrib.admin.templatetags.admin_modify import *
from django.contrib.admin.templatetags.admin_modify import submit_row as original_submit_row
# or 
# original_submit_row = submit_row

@register.inclusion_tag('admin/submit_line.html', takes_context=True)
def submit_row(context):
    ctx = original_submit_row(context)
    ctx.update({
        'show_save_and_add_another': context.get('show_save_and_add_another', ctx['show_save_and_add_another']),
        'show_save_and_continue': context.get('show_save_and_continue', ctx['show_save_and_continue'])
        })                                                                  
    return ctx 
于 2012-10-28T05:39:56.647 に答える
13

私が知る限り、これは「すぐに使える」オプションでは不可能ですが、これが私があなたがやりたいことをやろうとする方法です。

私たちが気にするコードのビットはこのtemplatetagです-これはあなたがそれを何に設定したかに関係なく、show_save_and_add_anotherオーバーライドするようです。show_save_and_continueまた、まったく新しいコンテキストを作成し、特定の値のみをコピーします(これが何であるかは明確ではありません)。そのため、必要なものを取得するには、コンテキストを変更する必要があります。

それで:

  1. 既存のタグを再利用するか(okmの例を参照)、完全に複製することにより、デフォルトのタグの機能を複製するテンプレートタグを作成します。ここでの唯一の変更はshow_save_and_add_another、元のコンテキストを上書きせずに保持するか、独自のreally_hide_save_and_add_another_damnitコンテキスト変数を渡す必要があることです。
  2. change_form.htmlを置き換えて、独自のテンプレートタグを含めて使用し、submit_rowそれを置き換えます。
  3. 追加のコンテキスト変数を使用するオプションを選択した場合は、change_form.htmlを更新し、ボタンを別の条件ステートメントでラップします。

次に、どのオプションを選択したかに関係なく、ModelAdminを次のように更新します(Djangoドキュメントのこれに基づく):

class MyModelAdmin(admin.ModelAdmin):
    # ...
    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context['show_save_and_add_another'] = False
        # or
        extra_context['really_hide_save_and_add_another_damnit'] = True
        return super(MyModelAdmin, self).change_view(request, object_id,
            form_url, extra_context=extra_context)

更新:元の応答は、submit_rowが元のコンテキスト全体を渡さないことを考慮していませんでした。

于 2012-10-27T21:24:03.057 に答える
5

非常に異なるアプローチは、/static/admin/css/base.css に以下を追加することです。

input[name="_addanother"],input[name="_continue"],input[name="_saveasnew"]{
    display: none;
}
于 2015-04-02T03:37:32.417 に答える