django为admin.TabularInline管理多个ForeignKey

时间:2014-09-23 20:23:32

标签: django django-admin

我正在尝试在管理部分中使用子表单实现表单。

form = Fighter()
subform = FighterFightHistory() //All of his fights

我的问题如下:

<class 'fighters.admin.Fights'>: (admin.E202) 'fighters.FighterFightHistory' has more than one ForeignKey to 'fighters.Fighter'.

那么如何让表单显示每个外键的下拉列表(fighteropponent)。

2个外键是(见下文):

  • 指向战斗机的链接(fighter
  • 指向对手的链接(opponent

战士/ models.py

class FighterFightHistory(TimeStampedModel):
    event = models.ForeignKey('events.Event', null=True)
    fight = models.ForeignKey('fights.Fight', null=True)
    fighter = models.ForeignKey(Fighter, related_name='%(app_label)s_%(class)s_fighter', null=True)
    howitended = models.ForeignKey('fights.HowItEnded', null=True)
    opponent = models.ForeignKey(Fighter, related_name='%(app_label)s_%(class)s_opponent', null=True)

    ended_in_round = models.IntegerField(blank=True, null=True)
    youtube_code = models.CharField(max_length=50, null=True, blank=True)
    win = models.NullBooleanField(blank=True, null=True)

战士/ admin.py

class Fights(admin.TabularInline):
    model = FighterFightHistory
    extra = 30


class FighterAdmin(admin.ModelAdmin):

    list_display = ('name', 'history_completed', 'modified', 'active')
    search_fields = ['name']
    inlines = [Fights, ]

2 个答案:

答案 0 :(得分:27)

这解决了我的问题(使用 fk_name ):

class Fights(admin.TabularInline):
    model = FighterFightHistory
    extra = 30
    fk_name = 'fighter'

答案 1 :(得分:2)

我的第一个想法是,您可以使用ManyToMany-Fields,然后将关系数限制为两个。但后来我想,你永远无法确定哪个Fighter-Object代表哪种类型。

然后我仔细研究了Django-Docs并发现了一些可以解决问题的方法:Django-Doc

有趣的部分是:

  

会员资格有两个外键给人(人和邀请者),这使得关系模糊不清,Django无法知道使用哪一个。在这种情况下,您必须使用through_fields明确指定Django应使用哪些外键,如上例所示。

我希望这会对你有所帮助。