web-dev-qa-db-ja.com

表示は許可されていますが、変更はできません。 -Django

ユーザーに表示の許可を与えることはできますが、変更または削除することはできません。

現在、表示されるアクセス許可は「追加」、「変更」、「削除」のみですが、「読み取り/表示」はありません。

一部のユーザーは、何が追加されたかを確認するために管理パネルを参照することしかできないため、これが本当に必要です。

23
RadiantHex

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 %}
20
dan-klasson

Django-admin-view-permissionアプリケーション を使用できます:

pip install Django-admin-view-permission

INSTALLED_APPS = [
    'admin_view_permission',
    'Django.contrib.admin',
    ...
]

更新:

Django 2.1 箱から出して表示権限があります。

6
Anton Shurashov

回避策の1つは、モデルに追加の「保存」権限を設定し、ユーザーがこの権限を持っているかどうかをmodeladminのsave_modelメソッドでチェックインすることです。持っていない場合は、このmodeladminですべてを実行できます。編集したデータを保存!

3

上記の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のグループ名があり、ログブックのみを表示したいとします。ただし、他のグループ名で変更を保存できます。

3
Charlesliam

Django adminで物事を表示することはできません。

そのための databrowse アプリがあります。

3
Valentin Golev

これは、次の方法で実行できます。

1)オブジェクトが作成されている場合は、フィールドを読み取り専用にすることができますが、これを行うと、誰もフィールドを変更できなくなります

2)データブラウジングを使用できます

3)フォーム検証を使用できます。ユーザーが選択したリストにない場合、フィールドが変更された場合に検証エラーがスローされます。

4)ビューを作成できます。ユーザーがリストに含まれている場合は、通常のフローにリダイレクトするか、単純なhtml読み取り専用ページにリダイレクトします。

5)jqueryを使用して、フィールドを読み取り専用にします。ユーザーはリストにありません。saveメソッドをオーバーライドして、スマートさを確認します。saveメソッドでエラーをスローすると、フォームが変更され、ユーザーがリストに含まれません。username= request.user .username

2
ha22109

Django 2.1では、has_change_permissionhas_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

2
Charlesthk

changeのみの権限を犠牲にする必要がある回避策があります。管理用テンプレートchange_form.htmlで、テンプレートのaddchangeの両方の権限を確認し、ユーザーが両方の権限を持っている場合にのみ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 %}

これはクリーンとはほど遠いものであり、標準の管理フォーム以外の方法が提供されている場合でもユーザーはデータを変更できますが、誤ってデータを変更しないようにスタッフを保護したいだけの場合は十分かもしれません。

0
Jarno

私はここで提案された答えで見ることができます、私が私自身の上で前述のすべての答えを試したので、あなたはおそらくあなたがあなた自身のために作る必要があるより多くの問題に直面するでしょう。私はついにこれを理解しました:

Django Admin Cookbook にある私が行った方法は、作成/追加時に編集可能にしたいフィールドを作成することですが、後でのみ読み取ります。つまり、オブジェクトを作成すると、リンクが提供するそのメソッドでオーバーライドするフィールドはすべて読み取り専用になり、データベースモデルに追加されると編集できなくなります。

0
Dev

ModelAdmin.change_viewをオーバーライドすることもできます(Djangoドキュメントに記載されています)。ユーザーがデータを更新できないように、save_modelもオーバーライドしてください。

0
Asdf

複製: 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 %}
0

これはかなり古いスレッドであり、ほとんどの人はすでにこれを知っていますが... Django 2.0には組み込みのview_permissionsすばらしい表示権限へのリンク

0
filtfilt