L'administrateur Django ManyToMany inline erreur "n'a pas de clé étrangère à"

92

Je configure l'administrateur Django sur les modèles suivants:

class Quote(models.Model):                                                  
    author = models.CharField(max_length=100)                               
    quote = models.CharField(max_length=1000)                               
    tags = models.ManyToManyField('Tag')                                    

class Tag(models.Model):                                                    
    name = models.CharField(max_length=100)                                 

Avec le code suivant:

class TagInline(admin.TabularInline):                                                                                               
    model = Tag                                                             

class QuoteAdmin(admin.ModelAdmin):                                         
    list_display = ('author', 'quote')                                      
    inlines = (TagInline,)                                                  

class TagAdmin(admin.ModelAdmin):                                           
    pass                                                                    

admin.site.register(Quote, QuoteAdmin)                                      
admin.site.register(Tag, TagAdmin)

Lorsque vous essayez d'afficher la page d'administration pour ajouter un Quote, la page affiche une erreur disant <class 'quotes.models.Tag'> has no ForeignKey to <class 'quotes.models.Quote'>. Cela ne s'est pas produit avant que j'aie ajouté un inline. Quel est le problème? Comment puis-je ajouter correctement un Tagen ligne?

(J'ai passé 20 bonnes minutes à chercher une réponse; j'ai trouvé des questions similaires mais aucune de leurs réponses n'a fonctionné pour moi.)

Humphrey bogart
la source

Réponses:

153

La documentation d'administration a une section dédiée à l'intégration avec des relations plusieurs-à-plusieurs. Vous devez utiliser Quote.tags.throughcomme modèle pour TagInline, au lieu de Taglui - même.

Cat Plus Plus
la source
Si j'ai un modal qui en a plusieurs manytomany field, cela signifie que pour chacun il en a besoin Inlineet qu'ils sont différents?
Sinux
4
@Rmatt Pour les relations plusieurs-à-plusieurs inversées model = Tag.quote_set.related.through
Manh Tai
Existe-t-il une astuce pour faire apparaître le modèle through comme un champ ID brut au lieu de lister une ligne très possible dans la base de données?
mlissner
et c'est pourquoi je commence à aimer Django
Daniel W.