【问题标题】:Permission to view, but not to change! - Django允许查看,但不能更改! - 姜戈
【发布时间】:2011-03-05 08:58:27
【问题描述】:

是否可以授予用户查看权限,但不能更改或删除。

目前我看到的唯一权限是“添加”、“更改”和“删除”......但那里没有“读取/查看”。

我真的需要这个,因为有些用户只能查阅管理面板,才能查看添加的内容。

【问题讨论】:

标签: python django django-admin


【解决方案1】:

您不能只在 django admin 中查看内容。

为此有一个databrowse 应用程序。

【讨论】:

【解决方案2】:

一种解决方法是在您的模型上拥有一个额外的“保存”权限,并检查模型管理员的 save_model 方法,如果用户有此权限,如果他没有,这意味着他可以在这个模型管理员中做所有事情,除了保存编辑的数据!

【讨论】:

  • 这是一个很棒的主意!!谢谢!我想我可能会将这个答案打勾为已接受:)
【解决方案3】:

您可以通过以下方式做到这一点:

1)您可以只在对象已创建的情况下将字段设置为只读。但是这样做没有人可以更改字段

2)你可以使用数据浏览

3)您可以使用表单验证,如果用户不在所选列表中,如果任何字段发生更改则抛出验证错误

4)您可以创建一个视图,如果用户在您的列表中,则将其重定向到正常流程,或者将他重定向到简单的 html 只读页面

5) 使用 jquery 使字段只读是用户不在列表中并覆盖保存方法以检查任何智能。在您的保存方法中,您抛出错误任何表单已更改并且用户不在您的列表中。用户名 = request.user.username

【讨论】:

    【解决方案4】:

    您也可以覆盖 ModelAdmin.change_view(如 Django 文档中所述)。只需确保您还覆盖 save_model 以确保用户无法更新数据

    【讨论】:

      【解决方案5】:

      更新:自 Django 2.1 this is now built-in.

      在 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 %}
      

      【讨论】:

      • 我按照这个答案删除了添加和删除按钮,但没有更改按钮。当我尝试以相同的方式(通过返回 false)删除更改按钮时,它根本不显示模型!
      • 您必须自己删除链接(例如使用 jQuery)。 save_model 方法不返回任何内容,因此用户无法保存。因此,即使他们偶然发现了链接,也不会造成任何伤害。或者我没听懂你的问题。
      • 这很好,但 Django 文档说 save_model 应该保存或删除数据,它不应该用于否决目的。 docs.djangoproject.com/en/1.4/ref/contrib/admin/…
      • @dan-klasson 将这些代码放在哪里。我的意思是第一个在 myproject 的 admin.py 文件中,第二个在 django/contrib/admin/templates/change_form.html
      • 这个答案确实需要更新,因为自 Django 2.1 以来这已经变得容易多了。见docs.djangoproject.com/en/2.1/releases/2.1/…
      【解决方案6】:

      向上文提到的 Bernhard Valant 提供样品。在我的 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,我希望他们只查看日志。但其他组名可以保存任何更改。

      【讨论】:

        【解决方案7】:

        重复: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 %}
        

        【讨论】:

          【解决方案8】:

          我有一个解决方法,需要牺牲 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 %}
          

          这远非干净,如果提供标准管理表单以外的其他方式,仍然允许用户更改数据,但如果您只是想保护员工不意外更改他们不应该更改的数据,这可能就足够了。

          【讨论】:

            【解决方案9】:

            你可以使用the django-admin-view-permission application:

            pip install django-admin-view-permission

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

            更新:

            Django 2.1 拥有开箱即用的查看权限。

            【讨论】:

              【解决方案10】:

              我可以看到这里提出的答案,你可能会面临比你自己需要做的更多的问题,因为我自己尝试了上述所有答案。我终于想通了:

              我的做法(您可以在 Django Admin Cookbook 中找到)是在创建/添加时使您想要编辑的字段成为可编辑的,但之后只能读取。换句话说,一旦您创建了对象,您在链接提供的该方法中覆盖的任何字段都将是只读的,一旦添加到数据库模型中,您将无法对其进行编辑。

              【讨论】:

              【解决方案11】:

              这是一个相当古老的线程,大多数人已经知道这一点,但是...... Django 2.0 内置了 view_permissions link to awesome view permissions

              【讨论】:

                【解决方案12】:

                在 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
                
                

                【讨论】:

                  猜你喜欢
                  • 2010-12-21
                  • 2012-01-05
                  • 2021-10-18
                  • 2023-04-08
                  • 2020-08-17
                  • 1970-01-01
                  • 2020-10-18
                  • 2013-02-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多