Django 1.11-将整个网站对给定组的用户设为只读(最好使用固定装置)

时间:2019-04-10 09:47:19

标签: django readonly user-permissions usergroups

我的问题与View permissions in Django不同,因为该问题解释了如何处理Django 2.1及更高版本中的问题,该问题在我使用Django 1.1时具有“查看”权限的概念。哪个没有。

Django 1.11

我有一个网上论坛用户,他们应该只能对网站上的所有内容进行只读访问。对字段,模型和实际数据没有限制,只有它们可以做什么(只读)。我知道可能的实现建议“逐字段”(或“将所有字段设为只读”)和“逐模型”解决方案。我想知道是否有一种方法可以使它更清洁,无论是在用户组级别还是至少在用户级别。

到目前为止,我的views.py是默认设置:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required 
def index(request):
    """View function for home page of site."""


    # Render the HTML template index.html with the data in the context variable
    return render(request, 'home.html')

理想情况下,我希望能够使用固定装置来做到这一点。 当前在灯具中,我的分组定义如下:

{
    "model": "auth.group",
    "fields": {
        "name": "some_group",
        "permissions": [
            [
                "add_somemodel",
                "myproject",
                "somemodel"
            ],
            [
                "change_somemodel",
                "myproject",
                "somemodel"
            ],
            [
                "delete_somemodel",
                "myproject",
                "somemodel"
            ]

         ]
       }
}

在Django 2.2中,我可以做到

{
    "model": "auth.group",
    "fields": {
        "name": "some_group",
        "permissions": [
            [
                "view_somemodel",
                "myproject",
                "somemodel"
            ]  
         ]
       }
}

但是在Django 1.11中,我只有“添加”,“删除”和“更改”-没有“查看”选项(根据文档enter link description here)。那么,有没有一种方法可以创建一个夹具,该夹具创建一个只对所有内容具有读取权限的组?

2 个答案:

答案 0 :(得分:0)

在您看来,您需要这样的内容(请注意,如果您属于适当的访问权限组,这是如何查看帖子的示例)

def post_detail(request, slug=None):
    if not request.user.is_staff or not request.user.is_superuser:
        raise Http404
    instance = get_object_or_404(Post, slug=slug)
    share_string = quote_plus(instance.content)
    context = {
        "title": instance.title,
        "instance": instance,
        "share_string": share_string,
    }
    return render(request, "post_detail.html", context)

请注意:

if not request.user.is_staff or not request.user.is_superuser:
        raise Http404

以下是一些可帮助您的文档的链接:

How to authenticate users

All attributes to django.contrib.auth

编辑: 我现在看到了您的代码,因此您想要实现的目标可以像这样

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required 
def index(request):
    """View function for home page of site."""
    # With that way although a user might be logged in
    # but the user might not have access to see the page
    if not request.user.is_staff or not request.user.is_superuser:
        raise Http404


    # Render the HTML template index.html with the data in the context variable
    return render(request, 'home.html')

这样,用户可以登录,但是如果不是工作人员或超级用户,则希望访问该页面。

答案 1 :(得分:0)

谢谢大家的回应。我没有弄清楚使用Django 1.11在数据库中仅使用user / group / permissions配置的方式,也许它不存在。这就是我最终得到的结果(非常类似于我4个小时前开始研究时对SO提出的第一个建议,只需很少的代码更改)

  1. 为仅包含“ change_somemodel”权限的新组创建一个固定装置,并创建一个用户作为该组的成员,即没有“ add_somemodel”和“ delete_somemodel”条目并将其加载到数据库中:
[
    {
        "model": "auth.group",
        "fields": {
            "name": "<my_new_group>",
            "permissions": [
                [
                    "change_<somemodel1>",
                    "<myproject>",
                    "<somemodel1>"
                ],

                [
                    "change_<somemodel2>",
                    "<myproject>",
                    "<somemodel2>"
                ]
             ]
    }
,
    {
    "model": "auth.user",
    "fields": {
        "password": "<my_password>",
        "last_login": null,
        "is_superuser": false,
        "username": "<my_username>",
        "first_name": "",
        "last_name": "",
        "email": "",
        "is_staff": true,
        "is_active": true,
        "date_joined": "2019-04-01T14:40:30.249Z",
        "groups": [
            [
                "<my_new_group>"
            ]
        ],
        "user_permissions": []
    }
}
],

这处理了第一部分:现在,当我以该用户身份登录时,对于我的用户的任何型号,我在任何地方都没有“添加新..”或“删除”按钮。

  1. 现在,当我为某个模型的给定实例加载视图时,我仍然具有可编辑的字段,并且仍然看到“保存”,“保存并添加另一个”和“保存并继续”按钮。为了解决这个问题,在我的所有模型都源自其中的超类的admin.py中,在其自定义def changeform_view中,我添加了:
if request.user.groups.filter(name='<my_new_group>'): 
   extra_context['show_save_and_add_another'] = False
   extra_context['show_save_and_continue'] = False
   extra_context['show_save'] = False

这使所有型号的那三个“保存”按钮消失,并且所有字段均为只读。现在,这个新用户无法为任何模型添加,删除或编辑任何内容,但是他们可以按照我的意愿看到所有内容。

就像在新版Django中一样,从2.1开始,这可以做得更好。