web-dev-qa-db-ja.com

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

Djangoサイトがたくさんあります。多くのモデルとフォームがあります。多くのカスタムフォームとフォームセットとインラインフォームセット、カスタム検証とカスタムクエリセットがあります。およびDjango= adminの「モデルの追加」は、カスタムクエリセットから500を介します。

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

が欲しいです /admin/appname/modelname/add/ 404(または適切な 'Go away'エラーメッセージ)を表示するために、[Add $ MODELNAME]ボタンを/admin/appname/modelname 見る。

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

137
Rory

Adminクラスのhas_add_permissionメソッドを次のようにオーバーロードするだけです。

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

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

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

管理者としてログインしている場合、[〜#〜] everything [〜#〜]に関係なく取得できます。

ただし、"General Access"(たとえば)と呼ばれる新しいユーザーグループを作成すると、すべてのモデルに変更と削除の権限のみを割り当てることができます。

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

7
Richard Cooke

私はこれがあなたを助けると思う..以下のコードは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

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

# 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

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

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

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

参照

0
C.K.

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

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」が魔法を行います。ありがとう。

0
Mohammad