web-dev-qa-db-ja.com

カスタムボタンをDjangoアプリケーションの管理ページに追加します

Djangoにアプリケーションがあり、管理者のみが使用できるルーチンが含まれています。管理アプリケーションのこのアプリケーションのセクションに、ルーチンを実行するためのボタンを追加します。

私はそのためのテンプレートを作成することになっていますか?それが事実である場合、管理者のアプリにHTMLテンプレートを追加するにはどうすればよいですか?または、単にボタンを追加するコマンドがありますか?

22

管理フォームをいじくるのは複雑になる可能性がありますが、リンク、ボタン、または追加情報を追加することが簡単で役立つことがよくあります。 (インラインで作成されていない関連オブジェクトへのリンクのリストのように、編集されているよりも表示されているものの場合は特にそうです)。

から Django docs

管理テンプレートのモジュール設計のため、通常はテンプレート全体を置き換える必要はなく、また勧められません。ほとんどの場合、変更する必要があるテンプレートのセクションのみをオーバーライドする方が適切です。

これにより、フォームの上部にリストが追加されます。

templates/admin/[your_app]/[template_to_override]に配置:

{% extends "admin/change_form.html" %}

{% block form_top %}

{% for item in original.items %}
  {{ item }}
{% endfor %}

{% endblock %}
15
Lincoln B

Django1.10:

1)admin/submit_line.htmlを上書き:

{% load i18n admin_urls %}
<div class="submit-row">
{% if extra_buttons %}
    {% for button in extra_buttons %}
        {{ button }}
    {% endfor %}
{% endif %}
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}
{% if show_delete_link %}
    {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
    <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
{% endif %}
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %}
</div>

もちろん、これはbuttonの文字列表現が適切なブラウザのinputまたはbutton要素であり、Django.utils.safestring.mark_safeで安全とマークされていることを前提としています。または、safeテンプレートフィルターを使用するか、buttonの属性に直接アクセスして、<input>を作成することもできます。私の意見では、そのようなものをpythonレベルに分離することをお勧めします。

2)オーバーライドMyModelAdmin.change_view

def change_view(self, request, object_id, form_url='', extra_context=None):
    extra_context = extra_context or self.extra_context()
    return super(PollAdmin, self).change_view(
        request, object_id, form_url, extra_context=extra_context,
    )

このメソッドを使用すると、任意のModelAdminにボタンを簡単に追加できます。ステップ(1)の代わりに、admin/change_form.htmlを拡張してブロックsubmit_rowをオーバーライドすることもできます。テンプレートで追加のタグが必要になるため、これは少し冗長になります。

すべてのモデル(または特定のサブセット)で追加のアクションを使用したい場合は、ModelAdminを目的の機能でサブクラス化します(例として、モデルにアーカイブを追加します。削除のオーバーライドを追加することもできます。 -および他のデフォルトボタン-モードが削除されるのではなくアーカイブされるようにするには、テンプレートの変更が必要になります)

11
DylanYoung

Django-admin-tools を使用することもできます。これにより、ダッシュボードのように管理者のフロントページを簡単にカスタマイズできます。 LinkListを使用して、いくつかのビューメソッドをポイントし、ユーザーが認証されているかどうかを確認できます。それはあなたのようになります:

# dashboard.py (read more about how to create one on Django-admin-tools docs)
class CustomIndexDashboard(Dashboard):
    """
    Custom index dashboard for captr.
    """
    def init_with_context(self, context):
        self.children.append(modules.LinkList(
            _('Tasks'),
            children=[
                ['Your task name', '/task']
            ]
        ))

# urls.py (mapping uri to your view function)
urlpatterns += patterns('yourapp.views',
    (r'^task$', 'task'),
)

# views.py
def task(request):
    if request.user.is_authenticated():
        update_definitions_task.delay() # do your thing here. in my case I'm using Django-celery for messaging

    return redirect('/admin')
2
saulobrito

必要に応じて、この種類のオブジェクト(組み込みの「削除」と同様)にカスタム管理アクションを追加することを検討してください。いくつかの利点は次のとおりです。「純粋なDjango」。テンプレートをいじる必要がなく、一度に複数のオブジェクトを操作できます。

Djangoの管理者は、「アクション」(変更リストページで選択されたオブジェクトのリストで呼び出される単純な関数)を作成して登録することができます。管理者の変更リストを見ると、この機能が動作していることがわかります。 Djangoには、すべてのモデルで利用可能な「選択したオブジェクトの削除」アクションが付属しています。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/

この記事から、カスタムアクションボタンを追加する方法についてのアイデアを得ました。しかし、私はより単純な組み込みアクションでうまくいくことができました。

https://medium.com/@hakibenita/how-to-add-custom-action-buttons-to-Django-admin-8d266f5b0d41

0
John Lehmann