当前位置: 首页 > 面试题库 >

在Django中查看权限

景稳
2023-03-14
问题内容

由于django管理员在auth中具有三个权限:添加,更改,删除!我想在管理面板中的此auth中添加查看权限。我知道我必须自定义权限才能在“ auth |
permission | can查看权限”中添加查看权限以查看所有条目!

方式:

[X] 1.在默认权限列表中添加了“视图”

#./contrib/auth/management/init.py
def _get_all_permissions(opts):

    "Returns (codename, name) for all permissions in the given opts."
    perms = []
    for action in ('add', 'change', 'delete', 'view'):

        perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw)))

    return perms + list(opts.permissions)

[X] 2.测试将“查看”权限添加到所有模型

run manage.py syncdb

我确认已为auth_permissions表中的所有表添加了查看权限

[X] 3.将“ get_view_permission”添加到默认模型类。

将get_view_permission添加到模型类。您可以在文件./db/models/options.py中找到它。下一步,管理类将使用它。

def get_view_permission(self):

    return 'view_%s' % self.object_name.lower()

[X] 4.将“ has_view_permission”添加到默认管理类

为了保持一致,我将向系统添加“ has_view_permission”。看起来它应该在 contrib / admin / options.py中
。确保用户是否具有更改权限,然后将自动隐含查看权限。

# /contrib/admin/options.py
# Added has_view_permissions
def has_view_permission(self, request, obj=None):

    """
    Returns True if the given request has permission to change or view
    the given Django model instance.


    If obj is None, this should return True if the given request has
    permission to change *any* object of the given type.
    """
    opts = self.opts
    return self.has_change_permission(request, obj) or \

        request.user.has_perm(opts.app_label + '.' + opts.get_view_permission())


# modified get_model_perms to include 'view' too.
# No idea where this may be used, but trying to stay consistent
def get_model_perms(self, request):

    """
    Returns a dict of all perms for this model. This dict has the keys
    add, change, and delete and view mapping to the True/False
    for each of those actions.
    """
    return {

        'add': self.has_add_permission(request),
        'change': self.has_change_permission(request),
        'delete': self.has_delete_permission(request),
        'view': self.has_view_permission(request),

    }


# modified response_add function to return the user to the mode list
# if they added a unit and have view rights
...

    else:

        self.message_user(request, msg)

        # Figure out where to redirect. If the user has change permission,
        # redirect to the change-list page for this object. Otherwise,
        # redirect to the admin index.
        #if self.has_change_permission(request, None):
        if self.has_change_permission(request, None) or self.has_view_permission(request, None):

            post_url = '../'

        else:

            post_url = '../../../'

        return HttpResponseRedirect(post_url)

    # modified the change_view function so it becomes the details
    # for users with view permission

        #if not self.has_change_permission(request, obj):
        if not (self.has_change_permission(request, obj) or (self.has_view_permission(request, obj) and not request.POST)):

            raise PermissionDenied

        # modified the changelist_view function so it shows the list of items
        # if you have view permissions

def changelist_view(self, request, extra_context=None):

            "The 'change list' admin view for this model."
            from django.contrib.admin.views.main import ChangeList, ERROR_FLAG
            opts = self.model._meta
            app_label = opts.app_label
            #if not self.has_change_permission(request, None):
            if not (self.has_change_permission(request, None) or self.has_view_permission(request, None)):

                raise PermissionDenied

[X] 5.如果用户具有查看权限,则更新默认模板以列出模型

我在contrib / admin / templates / admin /
index.html中修改了默认模板。也可以通过将文件复制到本地模板目录来解决。我对两者都进行了更改,因此如果以后的升级覆盖了我的更改,我将获得一份副本。

{% for model in app.models %}

    <tr>
    {% if model.perms.change %}

        <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>

    {% else %}

        {% if model.perms.view %}

            <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>

        {% else %}

            <th scope="row">{{ model.name }}</th>

        {% endif %}

    {% endif %}

[X] 6.确认用户可以“查看”但不能“更改”模型

找到的contrib / admin / templatetags /
admin_modify.py似乎可以控制是否保存/保存并继续按钮。将“保存”字段从默认值始终更改为True,以检查上下文和权限。如果用户具有更改或添加权限,则他们应该能够保存。

'show_save': (change and context['has_change_permission']) or (context['add'] and context['has_add_permission'])

[X] 7.如果用户正在查看项目,请删除“保存并添加另一个”按钮

再次修改了contrib / admin / templatetags /
admin_modify.py。我不知道’save_as’是什么意思,所以也许我弄坏了一些东西,但是它似乎起作用了。

#'show_save_and_add_another': context['has_add_permission'] and
# not is_popup and (not save_as or context['add']) ,
'show_save_and_add_another': not is_popup and
    (( change and context['has_change_permission']) or (context['add'] and context['has_add_permission']))
    and
    (not save_as or context['add']),

[X] 8.修改“查看”权限以使表格只读

如果用户具有“查看”权限和“更改”权限,则什么都不做。更改替代视图。

如果用户具有“查看”权限而没有“更改”,则更改默认表单,并将DISABLED或READONLY属性添加到表单元素。并非所有浏览器都支持此功能,但出于我的目的,我可以要求用户使用正确的浏览器。[禁用/只读示例]
[1]

发现并非所有浏览器都支持“只读”,因此将某些控件设置为只读,将其他控件设置为禁用。这允许用户在需要时从文本控件复制数据。

#/django/contrib/admin/templates/admin/change_form.html


{# JavaScript for prepopulated fields #}
{% prepopulated_fields_js %}


</div>
</form></div>
{% if has_view_permission and not has_change_permission %}

    <script type="text/javascript">
    jQuery('input:text').attr('readonly', 'readonly');
    jQuery('textarea').attr('readonly', 'readonly');
    jQuery('input:checkbox').attr('disabled', true);
    jQuery('select').attr('disabled', true);
    jQuery('.add-another').hide();
    </script>

{% endif %}

答案源:我修改了怎样的Django创建“查看”的权限?

问题:完成上述回答后,我已经完成,可以看到此127.0.0.1:8000/zh-
cn/admin/页面为只读
,但看不到用户中的用户127.0.0.1:8000/zh-cn/管理员/用户 。需要帮忙!


问题答案:

Django 2.1在默认权限中添加了查看权限。以下解决方案可能在Django的早期版本中有效。
https://docs.djangoproject.com/zh-CN/2.1/releases/2.1/#model-view-
permission

这是在Django 1.6.2中测试过的有效解决方案

[X] 1. Added 'view' to default permission list:好的
[X] 2. Test the 'view' permission is added to all models:好的

[X] 3. Add "get_view_permission" to default model class. 不再有用了:

def get_add_permission(self):
    """
    This method has been deprecated in favor of
    `django.contrib.auth.get_permission_codename`. refs #20642
    """
    warnings.warn(
        "`Options.get_add_permission` has been deprecated in favor "
        "of `django.contrib.auth.get_permission_codename`.",
        PendingDeprecationWarning, stacklevel=2)
    return 'add_%s' % self.model_name

所有这些方法都是如此 get_foo_permission

[X] 4. Add "has_view_permission" to default admin class 应该:

def has_view_permission(self, request, obj=None):
    """
    Returns True if the given request has permission to change or view
    the given Django model instance.


    If obj is None, this should return True if the given request has
    permission to change *any* object of the given type.
    """
    opts = self.opts
    codename = get_permission_codename('view', opts)
    return self.has_change_permission(request, obj) or \
        request.user.has_perm("%s.%s" % (opts.app_label, codename))

如果模型是内联模型,请检查其正确性,因此需要注意正确的视图

def get_inline_instances(self, request, obj=None):

    ...

    if not (inline.has_add_permission(request) or
            inline.has_change_permission(request, obj) or
            inline.has_delete_permission(request, obj) or
            inline.has_view_permission(request, obj)):  # add the view right
        continue

    ...

进行修改get_model_perms以包含“视图”,以同样的方式执行以下操作:

def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):

    ...

    context.update({

        ...

        'has_view_permission': self.has_view_permission(request, obj), # add the view right

        ...

    })

    ....

允许“右视图”呈现页面(一个对象),并禁用“右视图”以保存对页面所做的修改,避免 [X] 8. Modify "view" permission to make form read only

@csrf_protect_m
@transaction.atomic
def change_view(self, request, object_id, form_url='', extra_context=None):
    "The 'change' admin view for this model."
    model = self.model
    opts = model._meta

    obj = self.get_object(request, unquote(object_id))

    # addthe view right
    if not (self.has_view_permission(request, obj) or
            self.has_change_permission(request, obj)):
        raise PermissionDenied

    ...

    inline_instances = self.get_inline_instances(request, obj)
    # do not save the change if I'm not allowed to:
    if request.method == 'POST' and self.has_change_permission(request, obj):
        form = ModelForm(request.POST, request.FILES, instance=obj)

    ...

允许“右视图”呈现页面(所有对象的列表)

@csrf_protect_m
def changelist_view(self, request, extra_context=None):
    """
    The 'change list' admin view for this model.
    """
    from django.contrib.admin.views.main import ERROR_FLAG
    opts = self.model._meta
    app_label = opts.app_label
    # allow user with the view right to see the page
    if not (self.has_view_permission(request, None) or
            self.has_change_permission(request, None)):
        raise PermissionDenied

    ....

[X] 5. Update default template to list models if user has view permission:可以,但是要避免修改html模板,请编辑此文件:contrib / admin / site.py

class AdminSite(object):

    @never_cache
    def index(self, request, extra_context=None):

        ...

        # add the view right
        if perms.get('view', False) or perms.get('change', False):
        try:
            model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name)
        except NoReverseMatch:
            pass

        ...

    def app_index(self, request, app_label, extra_context=None):

        ...

        # add the view right
        if perms.get('view', False) or perms.get('change', False):
            try:
                model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name)
            except NoReverseMatch:
                pass

        ...

[X] 6. Confirm user can "view" but not "change" the model[X] 7. Remove "Save and Add another" button if user is viewing an item:应该可以,但我做到了:

'show_save_as_new': context['has_add_permission'] and not is_popup and change and save_as,
'show_save': context['has_change_permission'],

[X] 8.修改“查看”权限以使表单只读:好的,但是我还有其他解决方案,请参见上文



 类似资料:
  • 问题内容: 我可以在Django的模板中使用Auth应用程序的权限检查吗?(我想在模板的末尾为特权用户显示一个简单的表单) 更重要的是,我是否应该这样做,或者这不是“ Django方式”吗? 问题答案: 如果你要检查模板中的权限,则以下代码就足够了: 其中,模型是指用户需要权限才能查看表单的模型。 有关更多示例,请参阅https://docs.djangoproject.com/en/stable

  • 在 MySQL 中,可以通过查看 mysql.user 表中的数据记录来查看相应的用户权限,也可以使用 SHOW GRANTS 语句查询用户的权限。 mysql 数据库下的 user 表中存储着用户的基本权限,可以使用 SELECT 语句来查看。SELECT 语句的代码如下: SELECT * FROM mysql.user; 要执行该语句,必须拥有对 user 表的查询权限。 注意:新创建的用户

  • 本文向大家介绍在Django中实现添加user到group并查看,包括了在Django中实现添加user到group并查看的使用技巧和注意事项,需要的朋友参考一下 一、添加user到group 第一种: 第二种: 二、查看group里面的用户 第一种: 第二种: 第三种: 以上这篇在Django中实现添加user到group并查看就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多

  • 问题内容: 如何查看“反向”正在查看的当前urlpattern? 我在观点中以我认为应该起作用的观点调用反向,但是没有作用。以任何方式我可以检查其中的内容以及为什么没有显示我的图案? 问题答案: 如果要获取项目中所有URL的列表,首先需要安装django-extensions,将其添加到您的设置中,如下所示: 然后,在终端中运行此命令

  • 问题内容: 默认情况下,Django Django Django管理站点显示相关模型/表的所有记录以供查看。如何仅显示符合特定条件的记录? 问题答案: 在管理员定义中,你可以定义一个返回该模型管理员的查询集的方法。例如: 然后,只有的对象在管理员中可见。

  • 问题内容: 我想在一个简单的Docker容器中运行Django。 首先,我使用Docker-file构建了我的容器。没有什么特别的(只有FROM,RUN和COPY命令) 然后我用命令运行容器 输入我的容器: 运行Django服务器: 得到了: 但是当我转到127.0.0.1:8000时,我什么也看不到: 没有Nginx或其他工作服务器。 我究竟做错了什么? 更新1(Dockerfile) 问题答案