読み取り専用としての全モデル

django管理者の読み取り専用モデルを作成する方法はありますか?私は全体のモデルを意味します。 だから、追加、削除、変更なし、オブジェクトとフィールド、すべてを読み取り専用として参照してください?

13
進行中の作業です: github.com/django/django/pull/5297
追加された 著者 Bosco,

5 答え

ModelAdminは、get_readonly_fields()フックを提供します。以下は、テストされていません。私の考えは、ModelAdminのやり方で、readonlyフィールド自体で再帰的に実行することなく、すべてのフィールドを決定することです。

from django.contrib.admin.util import flatten_fieldsets

class ReadOnlyAdmin(ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if self.declared_fieldsets:
            fields = flatten_fieldsets(self.declared_fieldsets)
        else:
            form = self.get_formset(request, obj).form
            fields = form.base_fields.keys()
        return fields

このサブクラス/ mixinこの管理者は読み取り専用の管理者でなければなりません。

追加/削除やボタンの表示を消すには、おそらく

    def has_add_permission(self, request):
        # Nobody is allowed to add
        return False
    def has_delete_permission(self, request, obj=None):
        # Nobody is allowed to delete
        return False

P.S .: ModelAdminでは、has_change_permission(ルックアップまたはオーバーライド)がFalseを返した場合、オブジェクトの変更ビューには到達せず、そのリンクも表示されません。実際にはうまくいくでしょうし、デフォルトのget_readonly_fields()は上記のように変更許可をチェックし、すべてのフィールドを読み取り専用に設定します。そうすれば、非チェンジャーは少なくともデータをブラウズすることができます...現状の管理構造はビュー=編集を前提としているので、ジャイナリズムが指摘しているように、これはおそらく追加/変更/削除の上に "ビュー" ...

編集:すべてのフィールドを読み取り専用に設定することについても、テストされていませんが有望です:

readonly_fields = MyModel._meta.get_all_field_names()

編集:ここに別のものがあります

if self.declared_fieldsets:
    return flatten_fieldsets(self.declared_fieldsets)
else:
    return list(set(
        [field.name for field in self.opts.local_fields] +
        [field.name for field in self.opts.local_many_to_many]
    ))
11
追加された
PS:そのような機能のリクエストを作成しました。 code.djangoproject.com/ticket/17295
追加された 著者 Danny W. Adair,
注:get_formsetメソッドは、InlineModelAdminに対してのみ定義されています。
追加された 著者 Vajk Hermecz,
こんにちは、このコンパイルオプションのおかげで。私は彼らがあなたのものではないことが分かるので、あなたが作品から得た答えへのリンクを提供することは丁寧ですが。もう一つの利点は、読者が他の人たちがそれぞれの提案に対して行ったコメントも見ることができるということです。
追加された 著者 steps,
Django 1.11で動作しません - AttributeError: 'ReadOnlyAdmin'オブジェクトに 'declared_fieldsets'属性がありません
追加された 著者 turbotux,

残念なことに、 "表示権限"として rel="nofollow noreferrer"> Django 1.11にすることはできません。モデル管理の変更を保存し、モデル履歴のログエントリを追加するの両方でモデル管理を読み取り専用にするソリューションです。

def false(*args, **kwargs):
    """A simple no-op function to make our changes below readable."""
    return False

class MyModelReadOnlyAdmin(admin.ModelAdmin):
    list_display = [
        # list your admin listview entries here (as usual) 
    ]
    readonly_fields = [
        # list your read-only fields here (as usual)
    ]

    actions = None
    has_add_permission = false
    has_delete_permission = false
    log_change = false
    message_user = false
    save_model = false

false のノーオペルヘルパーと False の組み込みを誤ってはいけません。ヘルパー関数を外部に共感しない場合はクラスをクラスに移動し、それを no_op などと呼び、通常の def で影響を受けた属性をオーバーライドします。 ..)

この意志:

  1. リストビューでアクションのドロップダウンボックス(「削除」)を削除する
  2. 新しいモデルエントリを追加できないようにする
  3. 既存のモデルエントリを削除できないようにする
  4. モデル履歴にログエントリを作成しないようにする
  5. 保存後にメッセージが「変更されました」というメッセージを表示しないようにする
  6. データベースにチェンジフォームの変更を保存しないようにする

ならない:

  • 「保存して編集を続ける」と「保存する」の2つのボタンを削除または置き換えます(ユーザーエクスペリエンスを向上させるのに便利です)。

受け入れられた回答に記載されている get_all_field_names は、 Django 1.10 で削除されました。 Djangoでテスト済み1.10.5。

3
追加された

ModelAdmin クラスは readonly_fields 属性を使用します。詳細については、この回答をご覧ください。

2
追加された
ありますが、簡単ではありません。あなたはDjangoでカスタム権限を作成することができますが、管理サイトについて言えば、それは自明ではありません。 Djangoは、管理インターフェースでコンテンツを表示することが許可されている場合、編集を許可することも想定しています。大胆な感じがある場合は、この質問からの提案をお試しください。 IMOでは、すべてのフィールドを読み込み専用に明示的に設定して移動するほうが簡単です。
追加された 著者 jathanism,
すべての属性をreadonly_fieldsリストに追加することなく、全体モデルをread_onlyにする方法はありますか?
追加された 著者 juliomalegria,

Django 1.8に関する私のテストによれば、答え#3のように次のように使うことはできませんが、 Django 1.4

##     self.get_formset(request, obj)      ##
answer 3 needs fix. Generally, alternative codes for this issue about below section 
##          form = self.get_formset(request, obj).form    ##
##          fields = form.base_fields.keys()              ##

次のようなことができます:

#~ (A) or
[f.name for f in self.model._meta.fields]

#~ (B) or
MyModel._meta.get_all_field_names()

#~ (C) 
list(set([field.name for field in self.opts.local_fields] +
                        [field.name for field in self.opts.local_many_to_many]         
  ))
1
追加された

私は似たようなシナリオを持っていました:

  1. ユーザーがモデルオブジェクトを作成できる必要があります
  2. ユーザーがモデルオブジェクトのリストを表示できるようにする必要があります
  3. ユーザーは、作成後にオブジェクトを編集することはできません

1.変更ビューの上書き

ModelAdminの change_view()をオーバーライドすることができるため、モデルインスタンスの作成後にモデルインスタンスを編集できないようにすることができます。ここで私が使用した例があります:

def change_view(self, request, object_id, form_url='', extra_context=None):
    messages.error(request, 'Sorry, but editing is NOT ALLOWED')
    return redirect(request.META['HTTP_REFERER'])

2.条件付きで権限の編集を変更する

ドキュメントが ModelAdmin.has_change_permission()の結果をさまざまな方法で解釈することもわかりました。

objの編集が許可されている場合はTrueを返し、そうでない場合はFalseを返します。もし   objはNoneで、TrueかFalseを返して編集を指示する必要があります   このタイプのオブジェクトは一般的に許可されています(例:Falseは   現在のユーザが編集を許可されていないことを意味すると解釈される   このタイプのオブジェクト)。

意味私は objNone であるかどうかを調べることができ、そうでない場合は True を返し、そうでなければ False これにより、ユーザーは変更リストを表示できますが、モデルインスタンスの保存後にchange_formを編集したり表示したりすることはできません。

def has_change_permission(self, request, obj = None, **kwargs):
    if obj is None:
        return True
    else:
        return False

考えているのは、不要な目で変更リストを見ることを許可する MODEL_can_change の権限を上書きするかもしれないと思っていますか?

0
追加された