28

モデルのモデルのリスト ビューの「追加」ボタンの横にボタンを追加し、ビュー関数を作成して自分の作業を行い、ユーザーをリスト ビューにリダイレクトします。

管理テンプレートをオーバーロードする方法を確認しましたが、自分の作業を行うビュー関数をどこに配置すればよいか、そのビューを管理 URL に登録するにはどうすればよいか、まだわかりません。

セキュリティについても疑問があります。私はそのアクションを管理者の中に入れたいので、ログインしていない場合は使用できません。

私はこれを見つけましたが、それが正しい方法かどうかはわかりません: http://www.stavros.io/posts/how-to-extend-the-django-admin-site-with-custom/

4

2 に答える 2

66

複数のアプリケーションが同じリソース (テンプレート、静的ファイル、管理コマンド、翻訳) の異なるバージョンを提供する場合、INSTALLED_APPS で最初にリストされているアプリケーションが優先されます。- INSTALLED_APPS に関する Django ドキュメント

'django.contrib.admin'アプリが の前にリストされていることを確認してくださいINSTALLED_APPS

change_list.html次のいずれかのディレクトリにテンプレートを作成します。

# Template applies to all change lists.
myproject/myapp/templates/admin/change_list.html      

# Template applies to change lists in myapp.
myproject/myapp/templates/admin/myapp/change_list.html  

# Template applies to change list in myapp and only to the Foo model.
myproject/myapp/templates/admin/myapp/foo/change_list.html  

テンプレートは自動的に取得されますが、上記のパスのいずれにもない場合は、管理モデル属性を介して指定することもできます。

class MyModelAdmin(admin.ModelAdmin):

    #... 
    change_list_template = "path/to/change_list.html"

それが存在する元の change_list.html の内容を調べることができますpath/to/your/site-packages/django/contrib/admin/templates/admin/change_list.html他の回答では、テンプレートをフォーマットする方法も示しています。Nikolai Saiko が、'extends' と 'super' を使用して関連する部分をオーバーライドする方法を示します。概要:

{% extends "admin/change_list.html" %} {% load i18n %} 
{% block object-tools-items %}
    {{ block.super }}
    <li>
        <a class="historylink" href="...">My custom admin page</a>
    </li>
{% endblock %}

href="..."URLを入力しましょう。管理 URL 名は名前空間「admin」にあり、次のように検索できます。

{% url 'admin:custom_view' %}

ボタンを change_form.html に追加する場合、現在のオブジェクト ID を渡したい場合があります。

{% url 'admin:custom_view' original.pk %}

ここで、カスタム ビューを作成します。これは通常のビュー (Web サイトの他のページと同様) または admin.py のカスタム管理ビューです。ModelAdmin の get_urls メソッドは、URLconf と同じ方法でその ModelAdmin に使用される URL を返します。したがって、URL ディスパッチャーに記載されているように拡張できます。

class MyModelAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(MyModelAdmin, self).get_urls()
        my_urls = patterns('',
            url(r'^my_view/$', self.my_view, name="custom_view")
        )
        return my_urls + urls

    def my_view(self, request):
        # custom view which should return an HttpResponse
        pass

    # In case your template resides in a non-standard location
    change_list_template = "path/to/change_list.html"

ModelAdmin でビューにパーミッションを設定する方法に関するドキュメントをお読みください: https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls

ビューを保護し、スタッフ ステータスのユーザーにのみアクセスを許可できます。

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def my_view(request):
    ...

request.user.is_active非アクティブなユーザーをチェックして処理することもできます。

更新: フレームワークを利用して、カスタマイズを最小限に抑えてください。多くの場合、アクションは良い代替手段となります: https://docs.djangoproject.com/en/1.5/ref/contrib/admin/actions/

更新 2: JS の例を削除して、ボタンのクライアント側を挿入しました。必要な場合は、リビジョンを参照してください。

于 2013-07-29T10:43:13.567 に答える