Django应用程序标签和用户权限

时间:2012-04-03 10:27:19

标签: django django-admin django-authentication

我有一个带有几个型号的应用程序。所有模型都在META集中有app_label。

现在我想向某些用户提供这些模型的某些权利。没有自定义权限,只是简单地添加/更改/删除来自Django的com权限。但是,如果应用程序具有app_label,则管理员不会显示这些内容。

因为可以给用户的权利命名就像应用程序(即使设置了app_label)我猜它是因为django无法找到模型? ......他们的app标签明显改变了......

我在这里缺少什么(如果有的话)我怎么能绕过这个?

我正在使用django 1.3

1 个答案:

答案 0 :(得分:1)

除非you have a good reason,否则不应更改app_label。

不幸的是,没有受支持的方式来更改将在管理员中显示的应用程序的名称。

首先,我检查了管理员代码并注意到它依赖于title() string method

class AdminSite(object):
    # snip ....

    def index(self, request, extra_context=None):
        # snip .....
                        app_dict[app_label] = {
                            'name': app_label.title(),
                            'app_url': reverse('admin:app_list', kwargs={'app_label': app_label}, current_app=self.name),
                            'has_module_perms': has_module_perms,
                            'models': [model_dict],
                        }

因此,解决方案是将app_label设置为具有重载标题方法的字符串,例如,使用这样的翻译:

msgid "testapp"
msgstr "My test application"

你可以这样做:

from django.utils.translation import ugettext_lazy as _
class TitleHack(str):
    def title(self):
        return _(self)

class Student(models.Model):
    class Meta:
        app_label = TitleHack(__package__)

现在,这非常讨厌,在使用之前你应该完全理解这段代码。希望这不是火箭科学,但仍然完全没有支持。

由于一些不明原因,管理员总是依赖于title(),这实际上是非常不一致的问题。您可以做的最好的事情是override the admin template per app,并在那里对您的应用名称进行硬编码。

否则,你必须在python的管理员的其他部分修改名称,这是非常的样板:

class HackedAppLabelAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
        """ take care of app_label for add and change view """
        context['app_label'] = self.model._meta.app_label.title()
        return super(HackedAppLabelAdmin, self).render_change_form(request, context, add, change, form_url, obj)

    def changelist_view(self, request, extra_context=None):
        """ take care of the changelist view """
        extra_context = extra_context or {} 
        extra_context['app_label'] = self.model._meta.app_label.title()
        return super(HackedAppLabelAdmin, self).changelist_view(request, extra_context)

admin.site.register(Student, HackedAppLabelAdmin)