проблема разрешения app_label Django - PullRequest
2 голосов
/ 11 февраля 2011

Я изменил ярлык приложения, выполнив это

class Model(models.Model):
     pass

     class Meta:
          app_label = 'App Name'
          db_table = 'app_table'

Таблица и приложение уже существуют, проблема в том, что при переходе в интерфейс администратора только суперпользователи могут просматривать приложение, а другиепользователей нет, я пытался добавить разрешения другому пользователю, но он не отображается в окне разрешений.

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 24 мая 2011

Это определенно ошибка в Django. Существует конфликт между разрешением app_label и contenttype app_label, в результате чего разрешение никогда не совпадает с правами администратора. В качестве обходного пути, пока это не будет исправлено, вы можете просто явно предоставить разрешение на ModelAdmin:

class MyModelAdmin(admin.ModelAdmin):
    ...
    def has_add_permission(self, request):
        return request.user.has_perm('app_label.add_modelclass')

    def has_change_permission(self, request, obj=None):
        return request.user.has_perm('app_label.change_modelclass')

    def has_delete_permission(self, request, obj=None):
        return request.user.has_perm('app_label.delete_modelclass')

Где app_label - это app_label корневой модели, а modelclass - это имя вашей прокси-модели в нижнем регистре.

0 голосов
/ 11 февраля 2011

app_label влияет на имя таблицы базы данных и записи типа контента.Как будто ваша модель будет перенесена в другое приложение.Разрешения зависят от contenttpyes.Syncdb исправит типы содержимого, создаст новые таблицы, создаст новые записи о разрешениях.Вам необходимо добавить разрешения для существующих пользователей / групп в этой модели, которая была «перемещена» в другое приложение.

0 голосов
/ 12 февраля 2011

Это может работать для вас:

Определите свой класс Model как обычно, например:

class MyModel(models.Model):
     pass

     class Meta:
          db_table = 'app_table'

Затем создайте модель прокси и измените метку приложения этой модели прокси, для 2-й модели, которая выглядит следующим образом:

class MyProxyModel(MyModel):
     pass

     class Meta:
          proxy = True
          app_label = 'app_name'

Примечание. Ярлык приложения должен быть в нижнем регистре и содержать знаки подчеркивания, а не пробелы, Django заменит символы подчеркивания и автоматически использует заглавную букву приложения.

Затем зарегистрируйте модель прокси-сервера независимо от того, какой ModelAdmin вы создали.

admin.site.register(MyProxyModel,MyModelAdmin)

Это должно привести к тому, что ваш MyModelAdmin будет отображаться под другой меткой приложения в интерфейсе администратора. Я не уверен, что это решит проблему с разрешениями, потому что у меня сейчас нет среды для тестирования, но она будет отображаться под другим другим ярлыком.

0 голосов
/ 11 февраля 2011

Я не уверен, что вы используете app_label, как здесь и задумано. Если вы пытаетесь улучшить читабельность названия вашей модели, используйте verbose_name в метаклассе вашей модели.

app_label , похоже, не самая лучшая документация, но, насколько я могу судить, это должно быть машиночитаемое имя.

...