Django管理者-特定のモデルの「追加」アクションを無効にする


147

私はたくさんのモデルとフォームがあるdjangoサイトを持っています。多くのカスタムフォーム、フォームセット、インラインフォームセット、カスタム検証、カスタムクエリセットがあります。したがって、モデル追加アクションは、他のものを必要とするフォームに依存し、django管理の「モデル追加」は、カスタムクエリセットから500を通過します。

特定のモデルの「$ MODELの追加」機能を無効にする方法はありますか?

私が欲しい/admin/appname/modelname/add/の上になるように404(エラーメッセージ「消える」または適した)、私はしたくない'$ MODELNAMEを追加]ボタン与える/admin/appname/modelnameビューを。

Django管理者は管理者アクション(http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions)を無効にする方法を提供しますが、このモデルの唯一のアクションは「delete_selected」です。つまり、管理アクションは既存のモデルにのみ作用します。これを行うためのジャンゴ風の方法はありますか?


参考までに:django adminの「アクション」は、チェンジリストビューでリスト内のチェックされた行に適用されるドロップダウンです。
Tim Diggins、

1
関連(しかし異なる)の質問:stackoverflow.com/questions/1721037/...
user9876

回答:


342

それは簡単has_add_permissionで、Adminクラスのメソッドを次のようにオーバーロードするだけです:

class MyAdmin(admin.ModelAdmin):
     def has_add_permission(self, request, obj=None):
        return False

7
これは私にはうまくいきませんでした。[モデルの追加]ボタンは、モデルの変更リストページに引き続き表示されます。
Cerin

ここでMyAdminとは何ですか?
user5319825 2016

1
MyAdminも次のように登録することを忘れないでadmin.site.register(MyModel, MyModelAdmin)ください。すべてをadmin.pyモデルのappフォルダに追加します。
djangonaut

そして、これがまさにPythonとDjangoが大好きな理由です。シンプル。よく働きました。ありがとうございました!
dxhans5 2018

2
Django 1.11で動作します。objパラメータは必要ありません。
fjsj

9

デフォルトでは、syncdbはモデルごとに3つのセキュリティ権限を作成します。

  1. 作成(別名追加)
  2. 変化する
  3. 削除する

あなたが管理者としてログインしている場合は、取得していないすべてのものをどんな。

ただし、たとえば「一般アクセス」と呼ばれる新しいユーザーグループを作成する場合は、すべてのモデルに変更と削除の権限のみを割り当てることができます。

次に、そのグループのメンバーであるログインしたユーザーは、「作成」権限を持たず、それに関連するものは何も画面に表示されません。


7

これはあなたに役立つと思います。以下のコードはadmin.pyファイルにある必要があります

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', )
    list_filter = ('name', )
    search_fields = ('name', )
    list_per_page = 20

    # This will help you to disbale add functionality
    def has_add_permission(self, request):
        return False

    # This will help you to disable delete functionaliyt
    def has_delete_permission(self, request, obj=None):
        return False

上記に加えて、投稿者

    # This will help you to disable change functionality
    def has_change_permission(self, request, obj=None):
        return False

これは2.2で動作します。また、スーパーユーザーの追加ボタンと削除ボタンも削除されます。まさに私が必要とするもの。
Erik Kalkoken

2

別の答えからコードをコピーするだけ

# In admin
# make the related field can't be added
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields['service'].widget.can_add_related = False
        return form

私の場合はインラインを使用します

# In inline formset e.g. admin.TabularInline
# disable all
    def get_formset(self, request, obj=None, **kwargs):
        formset = super().get_formset(request, obj, **kwargs)
        service = formset.form.base_fields['service']
        service.widget.can_add_related = service.widget.can_change_related = service.widget.can_delete_related = False
        return formset

in service = formset.form.base_fields['service'] base_fieldsはモデルで定義されたフィールドです

フォームで定義されている場合:

product = formset.form.declared_fields['product']

も参照


はい、base_fieldsそしてdeclared_fields私がこの事件から学んだ最も重要な発見です。
CK

0

これは遅すぎる回答です。誰かが同じ解決策を見つけているかのようにこれを投稿するだけです。

admin.pyファイルでは、次のことができます。

class MyModelForm(forms.ModelForm):

class Meta:
    model = MyModel
    fields = '__all__'


class MyModelAdmin(admin.ModelAdmin):
    form = QuestionTrackAdminForm
    list_display = ['title', 'weight']
    readonly_fields = ['title', 'weight']

admin.site.register(MyModel, MyModelAdmin)

ここでは、「readonly_fields」が魔法をかけています。ありがとう。


4
これは、「追加」ボタンの表示を妨げません。
Flimm

このソリューションは、フォームのタイトルとウェイトフィールドを無効にするだけです。これは、新しいMyModelAdminオブジェクトの作成を妨げるものではありません。これは、OPが求めていたと私が信じているオブジェクトです。
dxhans5 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.