Django – Как создать классы ModelAdmin в доступных разрешениях

Я сделал простое приложение Django. У меня есть одна модель «Посетитель». Моя цель состоит в том, чтобы две две таблицы отображались в администраторе Django. Один со всеми посетителями и один с только теми на сегодня.

Я получил все, что работает с приведенным ниже кодом, следуя этим инструкциям . Однако моя проблема заключается в том, что я не могу заставить VisitorExpectedTodayProxy отображаться в «доступных разрешениях» при редактировании групп на странице администратора. Кто-нибудь знает как это сделать?

Models.py

class Visitor(models.Model): visit_datetime = models.DateTimeField(null=True) visitor_name = models.CharField(max_length=500) #Make dummy models for different object views in admin interface class VisitorExpectedTodayProxy(Visitor): class Meta: proxy=True verbose_name = "Visitor" verbose_name_plural = "Today's Visitors and Regular Visitors" 

Обновить:

Я запускал syncdb, но я до сих пор не вижу его на сайте администратора. Результаты syncdb:

 $ python manage.py syncdb Syncing... No fixtures found. Synced: > django.contrib.auth > django.contrib.contenttypes > django.contrib.sessions > django.contrib.sites > django.contrib.messages > django.contrib.admin > south 

5 Solutions collect form web for “Django – Как создать классы ModelAdmin в доступных разрешениях”

Вот сценарий, который я использовал для ввода записей ContentType для прокси-объектов вручную, а затем создавал для них новые разрешения.

Это просто генерирует sql, который затем следует запустить в mysql. После этого они должны появиться в списке разрешений для пользователя, где их нужно будет добавить. Некоторые из соглашений об именах для них не очевидны.

 your_models=['proxy model', ] for model in models: model_nospace = model.replace(' ','') sql = 'insert into django_content_type (name, app_label, model) values ("%s","<<app_name>>","%s");'%(model,model_nospace) print sql for kind, permname in [('Can add','add_%s'%model_nospace), ('Can change','change_%s'%model_nospace), ('Can delete','delete_%s'%model_nospace),]: sql = 'insert into auth_permission (name, content_type_id, codename) values ("%s %s",(select id from django_content_type where name="%s"),"%s");'% (kind,model,model,permname) print sql 

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

Оказывается, что хотя разрешения для прокси-моделей, которые я создал, были перечислены в родительских приложениях после syncdb , и, хотя я предоставил своим не-супер пользователям все разрешения, ему по-прежнему запрещали доступ к моим прокси-моделям через администратора.

Хотя я не испробовал исправления на основе SQL выше, исправление ошибки на уровне Django работало для меня. Вам необходимо обходить известную ошибку Django ( https://code.djangoproject.com/ticket/11154 ) и подключиться к сообщению post_syncdb чтобы правильно создавать разрешения для прокси-моделей. Код ниже изменен с https://djangosnippets.org/snippets/2677/ на некоторые комментарии к этому потоку.

Я разместил это в файле myapp / models.py, который содержал мои прокси-модели. Теоретически это может жить в любом из ваших INSTALLED_APPS после django.contrib.contenttypes потому что его нужно загрузить после update_contenttypes обработчика post_syncdb сигнала post_syncdb чтобы мы могли его отключить.

 def create_proxy_permissions(app, created_models, verbosity, **kwargs): """ Creates permissions for proxy models which are not created automatically by 'django.contrib.auth.management.create_permissions'. See https://code.djangoproject.com/ticket/11154 Source: https://djangosnippets.org/snippets/2677/ Since we can't rely on 'get_for_model' we must fallback to 'get_by_natural_key'. However, this method doesn't automatically create missing 'ContentType' so we must ensure all the models' 'ContentType's are created before running this method. We do so by un-registering the 'update_contenttypes' 'post_syncdb' signal and calling it in here just before doing everything. """ update_contenttypes(app, created_models, verbosity, **kwargs) app_models = models.get_models(app) # The permissions we're looking for as (content_type, (codename, name)) searched_perms = list() # The codenames and ctypes that should exist. ctypes = set() for model in app_models: opts = model._meta if opts.proxy: # Can't use 'get_for_model' here since it doesn't return # the correct 'ContentType' for proxy models. # See https://code.djangoproject.com/ticket/17648 app_label, model = opts.app_label, opts.object_name.lower() ctype = ContentType.objects.get_by_natural_key(app_label, model) ctypes.add(ctype) for perm in _get_all_permissions(opts, ctype): searched_perms.append((ctype, perm)) # Find all the Permissions that have a content_type for a model we're # looking for. We don't need to check for codenames since we already have # a list of the ones we're going to create. all_perms = set(Permission.objects.filter( content_type__in=ctypes, ).values_list( "content_type", "codename" )) objs = [ Permission(codename=codename, name=name, content_type=ctype) for ctype, (codename, name) in searched_perms if (ctype.pk, codename) not in all_perms ] Permission.objects.bulk_create(objs) if verbosity >= 2: for obj in objs: sys.stdout.write("Adding permission '%s'" % obj) models.signals.post_syncdb.connect(create_proxy_permissions) # See 'create_proxy_permissions' docstring to understand why we un-register # this signal handler. models.signals.post_syncdb.disconnect(update_contenttypes) 
  ./manage.py syncdb 

Вот и все. Он добавляет записи в таблицу auth_permission.

То, что я сделал, чтобы исправить это, я удалил каждую таблицу (удалить только таблицы auth было недостаточно). Затем я прокомментировал юг от установленных приложений в settings.py (не уверен, что это вызывало проблемы).

Затем я запустил manage.py syncdb, и теперь все работает.

Мне просто нужно перезагрузить все мои данные. Я все еще не уверен, как это перепуталось в первую очередь.

Я документировал свой взлом, чтобы обойти это здесь.

  • В интерфейсе администратора Django существует ли способ дублировать элемент?
  • Фильтр запросов Django после конкатенации двух столбцов
  • Как фильтровать объекты для аннотации count в Django?
  • Как сделать бесконечные потоковые комментарии
  • Django, ManyToManyField - ProgrammingError: отношение foo_bar не существует. Признается в миграциях, хотя отношение никогда не создается
  • Как настроить модели Django с двумя типами пользователей с очень разными атрибутами
  • Django Many-to-Many (m2m) Отношение к той же модели
  • Отобразить таблицу объектов django
  • Django: Syncdb неправильно предупреждает, что поле «многие ко многим» устарело
  • Использование свойства метода пользовательской модели Django в order_by ()
  • Метод last () модели Django
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.