【问题标题】:Django admin sharing inlines between appsDjango 管理员在应用程序之间共享内联
【发布时间】:2011-04-02 15:25:58
【问题描述】:

我的项目中有一些我希望可重用的应用程序。

首先,我有一个基础内容应用程序,它定义了如何将内容添加到 ContentContainer。这允许其他模型继承 ContentContainer 以获得显示内容的能力。

在内容应用程序中,我有一个继承 ContentContainer 的 Page 模型。在另一个名为 events 的应用程序中,我有一个 Event 模型,它也继承了 ContentContainer。基本上,我的事件应用程序取决于我的内容应用程序(这是我想要的)。

这一切都非常适合建模。我的内容应用中有这个:

class ContentContainer(admin.ModelAdmin):
    #No fields, it just gets referred to by ContentItem

    class Meta:
        ordering = ['modified']

class ContentItem(TimeStampedModel):
    name = models.CharField(max_length=1500)
    page_order = models.IntegerField()
    container = models.ForeignKey(ContentContainer, blank=True)

    #make inheritance know the model type
    objects = InheritanceManager()

    class Meta:
        ordering = [ 'page_order', 'modified', 'name']

    def __unicode__(self):
        return self.name

    def render(self):
        return self.name


class TextContent(ContentItem):
    text = models.CharField(max_length=5000000)

    def render(self):
        return '<p>%s</p>' % self.text

然后在我的事件应用程序中我这样做:

class Event(AnnouncementBase, Addressable, ContentContainer):
    cost = CurrencyField(decimal_places=2, max_digits=10, blank=True, default=0.00)
    start_date = models.DateField(default = datetime.now().date())
    start_time = models.TimeField(default = datetime.now().time())
    end_date = models.DateField(blank=True, default=None, null = True)
    end_time = models.TimeField(blank=True, default=None, null = True)
    rsvp_deadline = models.DateTimeField(blank=True, default=None, null = True)

    class Meta:
        ordering = ['start_date', 'start_time', 'title']

所以现在事件可以有内容来渲染了。

这就是事情变得令人困惑的地方。我在内容应用程序的 admin.py 中定义了一系列内联。他们在那里工作得很好。另外,如果我将它们复制粘贴到事件应用程序中的 admin.py 中,它们也可以在那里工作。

但是,我不想重复代码。我想将内联从 admin.py 导入 events.py 在内容 admin.py 我有这个:

class TextContentInline(admin.TabularInline):
    model = models.TextContent
    extra = 1

class PageAdmin(ContainerAdmin):
    model = models.Page
    inlines = [LinkContentInline, TextContentInline]

有很多这样的内联。如何在我的 admin.py 模型之间共享它们?如果我尝试在事件 admin.py 中导入它们,我会收到一条错误消息,显示“模型页面已注册”。我已经尝试了大约 5 种不同的方法,我认为它们都不起作用。我想知道是否没有办法做到这一点。哦,我也在使用 Django 1.3。

【问题讨论】:

  • 问题,你是导入内联还是PageAdmin?

标签: django django-admin


【解决方案1】:

发生“已注册”错误是因为在导入模块时,Python 会执行顶层中的所有语句 - 其中之一是 admin.site.register,因此会被多次调用。

解决这个问题很容易 - 只需捕获异常并忽略它:

try:
    admin.site.register(MyModel, MyModelAdmin)
except admin.sites.AlreadyRegistered:
    pass

另一种方法是将您的内联类保存在一个完全独立的模块文件中——也许是admin_inlines.py——然后将它们从那里导入到每个需要它们的管理员中。

【讨论】:

  • 我将线条移动到一个名为 admin_inlines 的文件中。然后我创建了一个名为 CONTENT_INLINES 的常量列表,然后将其导入以用于两个管理模型。这样,如果我添加更多内联,我只需要更改一个常量。感谢您的出色回答,我会投票,但我还没有足够的代表。
猜你喜欢
  • 1970-01-01
  • 2012-10-15
  • 2011-05-07
  • 2011-12-15
  • 2010-09-25
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
相关资源
最近更新 更多