如何生成跨越模型的TabularInline

时间:2012-07-07 03:01:38

标签: python django django-admin

我有一个模型(预订),其中OneToOneField(线程)随后具有ForeignKey关系(消息)。我想在预订管理员上显示一个消息列表,但是介于两者之间的线程模型似乎很难/不可能?

Class Booking(Model):
    ...
    thread = models.OneToOneField('user_messages.Thread', verbose_name='thread')

class Thread(Model):
    ...

class Message(Model):
    thread = models.ForeignKey(Thread, related_name="messages")

有没有办法可以设置我的BookingAdmin,内联可以显示消息(跨越线程关系)?类似的东西:

class MessageInline(TabularInline):
    model = Message
    fk_name = '???'

class BookingAdmin(ModelAdmin):
    inlines = [MessageInline, ]

如果这是最好的方式,我很乐意覆盖Inlines的工作方式,但我不知道在哪里解决这个问题。它看起来像覆盖* get_formset *可能会成功吗?

1 个答案:

答案 0 :(得分:0)

这尚未完全测试,但似乎有效。解决方案是使用带有挂钩的内联和formset来替换预订的附加线程...

class BookingMessageFormset(BaseInlineFormSet):
    '''Given a Booking instance, divert to its Thread'''
    def __init__(self, *args, **kwargs):
        if 'instance' in kwargs:
            kwargs['instance'] = kwargs['instance'].thread
        else:
            raise Exception()  # TODO Not sure if/when this happens
        BaseInlineFormSet.__init__(self, *args, **kwargs)

class MessageInline(admin.TabularInline):
    model = Message
    formset = BookingMessageFormset

    def __init__(self, parent_model, admin_site):
        '''Override parent_model'''
        super(MessageInline, self).__init__(Thread, admin_site)