Ярлыки приложений Django и права пользователя - PullRequest
1 голос
/ 03 апреля 2012

У меня есть приложение с несколькими моделями. Все модели имеют app_label в наборе META.

Теперь я хочу дать определенным пользователям определенные права на эти модели. Нет пользовательских прав, просто добавить / изменить / удалить права, которые поступили от Django. Но если приложение имеет app_label, администратор не показывает их.

Поскольку права, которые можно дать пользователю, называются как приложение (даже если app_label установлен), я думаю, это потому, что django просто не может найти Модели? ... ярлык их приложения явно изменился ...

Что мне здесь не хватает (если вообще что-то) и как я могу обойти это?

Я использую Django 1,3

1 Ответ

1 голос
/ 03 апреля 2012

Вы не должны менять app_label, если у нет веских причин .

К сожалению, не существует поддерживаемого способа изменить имя приложения, которое будет отображаться в админке.

Сначала я проверил код администратора и заметил, что он использует строковый метод title () :

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 (), это на самом деле довольно противоречиво. Лучшее, что вы можете сделать, это переопределить шаблон администратора для приложения и жестко указать имя вашего приложения там.

Иначе, вам придется исправить имя в других частях администратора в 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)
...