gpt4 book ai didi

python - 在 Django 中查看权限

转载 作者:太空狗 更新时间:2023-10-29 17:01:40 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Permission to view, but not to change! - Django

(12 个回答)


5年前关闭。




由于 django admin 在它的 auth 中有三个权限:添加、更改、删​​除!我想在管理面板的此身份验证中添加查看权限。我知道我必须自定义权限才能在“身份验证|权限|可以查看权限”中添加查看权限才能查看所有条目!

方式:

[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 中找到它,这在下一步中由 admin 类使用。
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.修改“查看”权限,使表单只读

如果用户具有“查看”权限和“更改”权限,则什么都不做。更改覆盖 View 。

如果用户具有“查看”权限而没有“更改”,则更改默认表单并向表单元素添加 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 %}

答案来源: How can I MODIFY django to create "view" permission?

问题:按照上面的回答我已经完成并且可以看到这个 127.0.0.1:8000/en-us/admin/页面为只读 **但用户中的用户不可见 127.0.0.1:8000/en-us/管理员/用户 .需要帮忙!**

最佳答案

default permissions 添加“查看”权限列表

您的解决方案有效,但您应该尽可能避免编辑源代码。有几种方法可以在框架内实现这一点:

1. Add the permission期间 post_syncdb() :

在 your_app/management/下的文件中

from django.db.models.signals import post_syncdb
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission

def add_view_permissions(sender, **kwargs):
"""
This syncdb hooks takes care of adding a view permission too all our
content types.
"""
# for each of our content types
for content_type in ContentType.objects.all():
# build our permission slug
codename = "view_%s" % content_type.model

# if it doesn't exist..
if not Permission.objects.filter(content_type=content_type, codename=codename):
# add it
Permission.objects.create(content_type=content_type,
codename=codename,
name="Can view %s" % content_type.name)
print "Added view permission for %s" % content_type.name

# check for all our view permissions after a syncdb
post_syncdb.connect(add_view_permissions)

Whenever you issue a 'syncdb' command, all content types can be checked to see if they have a 'view' permission, and if not, create one.


  • 来源:The Nyaruka Blog

  • 2.添加权限到Meta permissions option :

    在每个模型下,您都会在其 Meta 中添加类似的内容。选项:
    class Pizza(models.Model):
    cheesiness = models.IntegerField()

    class Meta:
    permissions = (
    ('view_pizza', 'Can view pizza'),
    )

    这将完成与 相同的操作1 除非您必须手动将其添加到每个类。

    3. Django 1.7 新增,添加权限到Meta default_permissions option :

    在 Django 1.7 中,他们添加了 default_permissions Meta 选项。在每个模型下,您都可以在 default_permissions 选项中添加“ View ”:
    class Pizza(models.Model):
    cheesiness = models.IntegerField()

    class Meta:
    default_permissions = ('add', 'change', 'delete', 'view')

    关于python - 在 Django 中查看权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23104449/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com