如何使用admin中的contenttypes自定义模型的显示?

时间:2011-06-13 19:54:31

标签: django django-models django-admin django-contenttypes

我有这些模特:

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=".")

我正在为管理员注册所有模型,而我正在取消注册Group,User和Site。问题是,当我访问管理员中的附件时,我看到它呈现如下:

admin for attachment

在内容类型选择中,我看到此列表:

select

Attachment具有GenericForeignKey的原因是因为ProjectA和ProjectB都需要访问它。我知道ProjectA和ProjectB是相同的,但要求它们存储在2个单独的表中。我怎么能从管理员那里使用Attachment类?我知道如何使用普通视图中的contenttypes,但不是来自管理员。

在Attachment类中,我只想选择项目A或项目B,然后选择所有项目A或所有项目B的列表,然后是我想要附加的文件。

管理员可以做这样的事吗?我是否需要向用户显示Object Id列?

2 个答案:

答案 0 :(得分:8)

如果我没错,你想要这个。 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 :(得分:1)

你应该注意到

  

“知道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=".")  

这已经让你更接近你想要的地方......