Как я могу настроить отображение модели, используя типы контента в админке? - PullRequest
6 голосов
/ 13 июня 2011

У меня есть эти модели:

class App(models.Model):
  name = models.CharField(max_length=100)

class ProjectA(models.Model):
  name = models.CharField(max_length=100)
  app  = models.ForeignKey(App)

class ProjectB(ProjectA):
  pass

class Attachment(models.Model):
  content_type    = models.ForeignKey(ContentType)
  object_id       = models.PositiveIntegerField()
  project         = generic.GenericForeignKey("content_type","object_id")
  file            = models.FileField(upload_to=".")

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

admin for attachment

В списке Тип контента я вижу этот список:

select

Причина, по которой Attachment имеет GenericForeignKey, заключается в том, что и ProjectA, и ProjectB должны иметь к нему доступ. Я знаю, что ProjectA и ProjectB идентичны, но это требование, что они хранятся в 2 отдельных таблицах. Как я мог сделать класс Attachment пригодным для использования от администратора? Я знаю, как использовать типы содержимого из обычных представлений, но от администратора нет.

В классе Attachment я хотел бы иметь только выбор для проекта A или проекта B, а затем список всех проектов A или всех проектов B, за которым следует файл, который я хочу прикрепить.

Возможна ли такая вещь от Админа? Нужно ли показывать пользователю столбец Object Id?

Ответы [ 2 ]

8 голосов
/ 14 июня 2011

если я не ошибаюсь, вы этого хотите. http://code.google.com/p/django-genericadmin/

мой совет будет работать по-другому. Вы добавите немного больше формы в ProjectA, ProjectB как встроенный. в твоем admin.py

from django.contrib import admin
from django.contrib.contenttypes import generic

from myproject.myapp.models import Attachment, ProjectA, ProjectB

class Attachmentline(generic.GenericTabularInline): #or generic.GenericStackedInline, this has different visual layout.
    model = Attachment

class ProjectAdmin(admin.ModelAdmin):
    inlines = [
        Attachmentline,
    ]

admin.site.register(ProjectA, ProjectAdmin)
admin.site.register(ProjectB, ProjectAdmin)

зайдите к администратору ProjectA или ProjectB и увидите нового администратора.

это не то, что вы хотите, но это может помочь вам. в противном случае вам нужно проверить первую ссылку.

1 голос
/ 14 июня 2011

Вы должны заметить, что

"знаю, что ProjectA и ProjectB идентичны, но это требование они хранятся в 2 отдельных таблицах "

не совсем правильно. Все данные хранятся в вашей таблице app_projecta, и (только) некоторые указатели хранятся в таблице app_projectb. Если вы уже идете по этому пути, я бы предложил начать с этого:

class App(models.Model):
  name = models.CharField(max_length=100)

class Project(models.Model):
    name = models.CharField(max_length=100)
    app  = models.ForeignKey(App)

class ProjectA(Project):
  pass

class ProjectB(Project):
  pass

class Attachment(models.Model):
  project    = models.ForeignKey(Project)
  file            = models.FileField(upload_to=".")  

Это уже приближает вас к тому месту, куда вы хотите попасть ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...