【问题标题】:How to change name by default of permission in Django?如何在Django中默认更改名称?
【发布时间】:2014-06-18 15:39:55
【问题描述】:

帮我更改我的应用的权限名称

我的应用的权限:

[] articles | article | Can add article
[] articles | article | Can change article
[] articles | article | Can delete article

我想要西班牙语的权限名称

Articulo - Puede cambiar articulo
Articulo - Puede eliminar artículo
Articulo - Puede crear articulo

编辑:

我有两种选择:

1。创建中间件 AdminLocaleURLMiddleware

2。覆盖权限的unicode方法:

from django.utils import six
def permissions_new_unicode(self):
    nombre_clase = six.text_type(self.content_type)
    nombre_permiso = six.text_type(self.name)
    if 'Can delete' in nombre_permiso:
        nombre_permiso = nombre_permiso.replace('Can delete', 'Puede eliminar')
    elif 'Can add' in nombre_permiso:
        nombre_permiso = nombre_permiso.replace('Can add', 'Puede crear')
    elif 'Can change' in nombre_permiso:
        nombre_permiso = nombre_permiso.replace('Can change', 'Puede modificar')

    return u'%s - %s' % ( nombre_clase.title(), nombre_permiso)

替换权限类中的__unicode__方法

from django.contrib.auth.models import Permission
Permission.__unicode__ = permissions_new_unicode

【问题讨论】:

  • 您的浏览器设置为英文了吗?管理后端将以您的浏览器设置的任何语言显示。

标签: django permissions


【解决方案1】:

如果您想为 django 管理部分显式设置语言,请使用此

from django.conf import settings
from django.utils import translation


    class AdminLocaleURLMiddleware:

        def process_request(self, request):
            if request.path.startswith('/admin'):
                request.LANG = getattr(settings, 'ADMIN_LANGUAGE_CODE', settings.LANGUAGE_CODE)
                translation.activate(request.LANG)
                request.LANGUAGE_CODE = request.LANG

然后放到settings.py中某处:

ADMIN_LANGUAGE_CODE='es'

并添加中间件:

MIDDLEWARE_CLASSES = (
   ...
    'utils.multilang.middleware.AdminLocaleURLMiddleware',
   ....

【讨论】:

    【解决方案2】:

    有一个简短但棘手的答案。我不建议这样做,也不拒绝。但解决方案是: 编辑这个路径的app_labeled_name函数修饰为propertyContentType类的path/to/django/contrib/contenttypes/models.py,变成这样:

    @property
    def app_labeled_name(self):
        model = self.model_class()
        if not model:
            return self.model
        return '%s | %s' % (apps.get_app_config(model._meta.app_label).verbose_name,
                            model._meta.verbose_name)
    

    诀窍是使用apps.get_app_config(model._meta.app_label).verbose_name 而不是model._meta.app_label,因此它会使用与您应用的AppConfig 子类中为您的应用设置的任何用途相同的verbose_name

    【讨论】:

    • 该路径可能存在于您的计算机上,但对于其他许多人来说,它不存在。如果您想提供这样的解决方案,请提供一种可以使用子类/覆盖或猴子补丁来完成的方法。
    • 是的,你说得对,但是建议大家创建一个python的虚拟环境来开发django,没有安装django谁也开发不了。路径是相对的。
    • @Melvyn 你好,我提供了一个新的解决方案和一个完整的解决方案。你能访问并告诉我这件事吗? here
    • 看起来好多了。你在这里并没有真正使用信号,但那是次要的。如果它已经注册,您可能应该处理和unregister Permission
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2013-07-24
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多