2014-09-23 8 views
7

Sto cercando di implementare un modulo con una sottomaschera nella sezione di amministrazione.admin di django più di un ForeignKey per admin.TabularInline

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

Il mio problema è il seguente:

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

Allora, come faccio a fare il modulo di mostrare un menu a discesa per ciascuna chiave esterna (fighter, opponent).

La chiave esterna 2 sono (vedi sotto):

  • Un link alla caccia (fighter)
  • Un link all'avversario (opponent)

combattenti/modelli. 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) 

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

risposta

17

Questo risolto il problema (usando fk_name):

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

Il mio primo pensiero è stato, che si potrebbe usare ManyToMany-Campi e quindi limitare il numero dei rapporti a due. Ma poi ho pensato che non si può mai essere sicuri di quale Fighter-Object rappresenti quale tipo.

poi ho avuto un breve sguardo al Django-Docs e trovato qualcosa che dovrebbe rispondere alla tua problema: Django-Doc

La parte interessante è:

L'adesione ha due chiavi esterne a persona (persona inviter), il che rende ambigua la relazione e Django non può sapere quale usare. In questo caso, devi specificare in modo esplicito quali chiavi esterne Django dovrebbe usare usando through_fields, come nell'esempio sopra.

Spero che questo ti aiuti.

Problemi correlati