1

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

それが最善の方法である場合、インラインの動作方法をオーバーライドできてうれしいですが、どこに取り組むべきかわかりません。* get_formset *をオーバーライドするとうまくいくように見えますか?

4

1 に答える 1

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)
于 2012-07-07T04:15:31.803 に答える