ユーザーに表示の許可を与えることはできますが、変更または削除することはできません。
現在、表示されるアクセス許可は「追加」、「変更」、「削除」のみですが、「読み取り/表示」はありません。
一部のユーザーは、何が追加されたかを確認するために管理パネルを参照することしかできないため、これが本当に必要です。
Update:Django 2.1 これは現在組み込みです 。
Admin.pyで
# Main reusable Admin class for only viewing
class ViewAdmin(admin.ModelAdmin):
"""
Custom made change_form template just for viewing purposes
You need to copy this from /Django/contrib/admin/templates/admin/change_form.html
And then put that in your template folder that is specified in the
settings.TEMPLATE_DIR
"""
change_form_template = 'view_form.html'
# Remove the delete Admin Action for this Model
actions = None
def has_add_permission(self, request):
return False
def has_delete_permission(self, request, obj=None):
return False
def save_model(self, request, obj, form, change):
#Return nothing to make sure user can't update any data
pass
# Example usage:
class SomeAdmin(ViewAdmin):
# put your admin stuff here
# or use pass
Change_form.htmlで、これを置き換えます。
{{ adminform.form.non_field_errors }}
これとともに:
<table>
{% for field in adminform.form %}
<tr>
<td>{{ field.label_tag }}:</td><td>{{ field.value }}</td>
</tr>
{% endfor %}
</table>
次に、この行を削除して送信ボタンを削除します。
{% submit_row %}
Django-admin-view-permissionアプリケーション を使用できます:
pip install Django-admin-view-permission
INSTALLED_APPS = [
'admin_view_permission',
'Django.contrib.admin',
...
]
更新:
Django 2.1 箱から出して表示権限があります。
回避策の1つは、モデルに追加の「保存」権限を設定し、ユーザーがこの権限を持っているかどうかをmodeladminのsave_model
メソッドでチェックインすることです。持っていない場合は、このmodeladminですべてを実行できます。編集したデータを保存!
上記のBernhardVallantにサンプルを提供するため。 admin.pyファイルに配置します
class LogBookAdmin(admin.ModelAdmin):
list_display = ['dateEntry','due_date', 'controlNo', 'carrier', 'status']
exclude = ['encoder_status', 'engr_status', 'chief_status', 'ischecked']
def save_model(self, request, obj, form, change):
if request.user.groups.filter(name='Encoder').exists():
pass
else:
return super(LogBookAdmin, self).save_model(request, obj, form, change)
Encoder
のグループ名があり、ログブックのみを表示したいとします。ただし、他のグループ名で変更を保存できます。
Django adminで物事を表示することはできません。
そのための databrowse アプリがあります。
これは、次の方法で実行できます。
1)オブジェクトが作成されている場合は、フィールドを読み取り専用にすることができますが、これを行うと、誰もフィールドを変更できなくなります
2)データブラウジングを使用できます
3)フォーム検証を使用できます。ユーザーが選択したリストにない場合、フィールドが変更された場合に検証エラーがスローされます。
4)ビューを作成できます。ユーザーがリストに含まれている場合は、通常のフローにリダイレクトするか、単純なhtml読み取り専用ページにリダイレクトします。
5)jqueryを使用して、フィールドを読み取り専用にします。ユーザーはリストにありません。saveメソッドをオーバーライドして、スマートさを確認します。saveメソッドでエラーをスローすると、フォームが変更され、ユーザーがリストに含まれません。username= request.user .username
Django 2.1では、has_change_permission
とhas_delete_permission
をオーバーライドする必要があります:
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def has_change_permission(self, request, obj=None):
return False
def has_delete_permission(self, request, obj=None):
return False
# to disable view and add you can do this
def has_view_permission(self, request, obj=None):
return False
def has_add_permission(self, request):
return False
changeのみの権限を犠牲にする必要がある回避策があります。管理用テンプレートchange_form.html
で、テンプレートのaddとchangeの両方の権限を確認し、ユーザーが両方の権限を持っている場合にのみsubmit_row
を表示します。したがって、変更権限を持つユーザーは、change_listとchange_formのみを表示できますが、行った変更を送信するためのボタンは表示されません。
私が行った変更:
myapp/templates/admin/myapp/
のようなディレクトリをアプリテンプレートディレクトリに作成しますchange_form.html
をプルします交換
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
と
{# Use change permission only as read only #}
{% if has_change_permission and has_add_permission %}
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
{% endif %}
これはクリーンとはほど遠いものであり、標準の管理フォーム以外の方法が提供されている場合でもユーザーはデータを変更できますが、誤ってデータを変更しないようにスタッフを保護したいだけの場合は十分かもしれません。
私はここで提案された答えで見ることができます、私が私自身の上で前述のすべての答えを試したので、あなたはおそらくあなたがあなた自身のために作る必要があるより多くの問題に直面するでしょう。私はついにこれを理解しました:
Django Admin Cookbook にある私が行った方法は、作成/追加時に編集可能にしたいフィールドを作成することですが、後でのみ読み取ります。つまり、オブジェクトを作成すると、リンクが提供するそのメソッドでオーバーライドするフィールドはすべて読み取り専用になり、データベースモデルに追加されると編集できなくなります。
ModelAdmin.change_viewをオーバーライドすることもできます(Djangoドキュメントに記載されています)。ユーザーがデータを更新できないように、save_modelもオーバーライドしてください。
複製: https://stackoverflow.com/a/33543817/101831
https://djangosnippets.org/snippets/10539/ を参照してください
class ReadOnlyAdminMixin(object):
"""Disables all editing capabilities."""
change_form_template = "admin/view.html"
def __init__(self, *args, **kwargs):
super(ReadOnlyAdminMixin, self).__init__(*args, **kwargs)
self.readonly_fields = self.model._meta.get_all_field_names()
def get_actions(self, request):
actions = super(ReadOnlyAdminMixin, self).get_actions(request)
del actions["delete_selected"]
return actions
def has_add_permission(self, request):
return False
def has_delete_permission(self, request, obj=None):
return False
def save_model(self, request, obj, form, change):
pass
def delete_model(self, request, obj):
pass
def save_related(self, request, form, formsets, change):
pass
templates/admin/view.html
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block submit_buttons_bottom %}
<div class="submit-row">
<a href="../">{% blocktrans %}Back to list{% endblocktrans %}</a>
</div>
{% endblock %}
templates/admin/view.html(Grappelliの場合)
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block submit_buttons_bottom %}
<footer class="grp-module grp-submit-row grp-fixed-footer">
<header style="display:none"><h1>{% trans "submit options"|capfirst context "heading" %}</h1></header>
<ul>
<li><a href="../" class="grp-button grp-default">{% blocktrans %}Back to list{% endblocktrans %}</a></li>
</ul>
</footer>
{% endblock %}
これはかなり古いスレッドであり、ほとんどの人はすでにこれを知っていますが... Django 2.0には組み込みのview_permissions
すばらしい表示権限へのリンク