我有一个带有几个型号的应用程序。所有模型都在META集中有app_label。
现在我想向某些用户提供这些模型的某些权利。没有自定义权限,只是简单地添加/更改/删除来自Django的com权限。但是,如果应用程序具有app_label,则管理员不会显示这些内容。
因为可以给用户的权利命名就像应用程序(即使设置了app_label)我猜它是因为django无法找到模型? ......他们的app标签明显改变了......
我在这里缺少什么(如果有的话)我怎么能绕过这个?
我正在使用django 1.3
答案 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)