2012-07-07 78 views
1

我有一個OneToOneField(線程)模型(預訂),隨後有一個ForeignKey關係(消息)。我想在預訂管理員中顯示一條消息列表,但在兩者之間的線程模型中,似乎很難/不可能?如何生成跨越模型的TabularInline

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, ] 

我很高興重寫Inline的工作方式,如果這是最好的方式,但我不知道該在哪裏解決。它看起來像覆蓋* get_formset *可能會伎倆?

+0

這也許可以幫助:http://stackoverflow.com/questions/3681258/nested-inlines-in-該django管理 或此:http://stackoverflow.com/questions/702637/django-admin-inline-inlines-or-three-model-editing-at-once 我知道這些鏈接有外鍵而不是像你的那樣oneotoonefield,但答案應該是相同的,因爲如果我沒有錯,'OneToOneField'和'ForeignKey'是一樣的,但有一些限制使得每個「鏈接」(關係)是唯一的 – marianobianchi 2012-07-07 03:49:27

+0

@ marianobianchi好的建議,我認爲嵌套內聯試圖解決太多的問題,但方法是正確的。我已經想出了一些(下面的答案),這就足夠了。 – Rog 2012-07-07 04:11:15

回答

0

這還沒有完全測試,但似乎工作。解決的辦法是有一個內聯和表單集與掛鉤與所連接的線來代替預訂...

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)