2009-12-02 6 views
1

Voici les définitions du modèle:Django: ManyToMany erreur Inline vue admin

class ItemBrand(models.Model): 
    name = models.CharField(max_length = 30, unique = True) 

    def __unicode__(self): 
     return self.name 

class WantedItem(models.Model): 
    name = models.CharField(max_length = 120) 
    description = models.TextField() 
    created = models.DateTimeField(auto_now = False, auto_now_add = True) 
    expires = models.DateTimeField(auto_now = False, auto_now_add = False) 
    type = models.ForeignKey(ItemType, related_name = "type wanted") 

    GENDER_CHOICES = (
     (1, 'Male'), 
     (2, 'Female') 
    ) 

    gender = models.IntegerField(choices = GENDER_CHOICES)  
    brands = models.ManyToManyField(ItemBrand, related_name = "wantedbrands", symmetrical = False) 
    colors = models.ManyToManyField(ItemColor) 
    sizes = models.ManyToManyField(ItemSize) 
    creator = models.ForeignKey(User, related_name = "wishlist creator") 

    def __unicode__(self): 
     return self.name 

Voici le code AdminModel:

class BrandsInline(admin.TabularInline): 
    model = WantedItem.brands.through 

class WantedItemAdmin(admin.ModelAdmin): 
    list_display = ('name', 'created', 'expires', 'type', 'gender', 'creator')  
    search_fields = ('name', 'description') 
    list_filter = ('created', 'brands',) 
    ordering = ('-created',) 
    inlines = [ 
     BrandsInline, 
    ] 
    exclude = ('brands',) 

Ceci est tiré essentiellement droite de la documentation de Django, et voici l'erreur Je reçois:

objet 'ReverseManyRelatedObjectsDescriptor' n'a pas d'attribut 'à'

Je suis à perte totale ... des idées? Même si je crée littéralement une table de liens et que je mets l'attribut "through" dans le modèle, j'obtiens la même erreur.

Broken?

+0

Ce code "corrigé" vous permet-il de résoudre le problème? Comme je le vois, WantedItem.brands se réfère à ItemBrand et qui n'a pas de propriété à travers (pas non plus indiqué pour inverser) –

+0

S'il vous plaît corriger les espaces. – Alasdair

+0

@Christian P. - c'était aussi ma première réflexion sur la propriété 'through', mais il s'avère que c'est la façon de remplacer les widgets many-to-many par des inlines. Voir http://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-models – Alasdair

Répondre

2

Vous devez mettre à jour Django du tronc.

L'utilisation de lignes avec des champs many-to-many est nouveau dans la version de développement django (see docs). En utilisant une version simplifiée de vos modèles, j'obtiens la même erreur que vous pour Django 1.1.1, mais cela fonctionne sur le tronc (révision 11785).


En aparté, vous n'avez pas besoin de spécifier symmetrical = False sur votre ItemBrand champ ManyToMany. L'option symétrique est uniquement destinée aux relations récursives, par exemple User <-> User.

Vous voudrez peut-être jeter un oeil à la documentation on related names, et pensez à les renommer en quelque chose de plus logique. Si creator est un objet User, et que vous souhaitez obtenir l'ensemble des listes qu'ils ont créés, la valeur par défaut lorsque related_name n'est pas spécifiée est

avec votre choix pour related_name (lorsque vous ajoutez le trait de soulignement), cela change à

creator.wishlist_creator.all() 

mais je recommande related_name='wishlists', dans ce cas, vous devez utiliser

creator.wishlists.all() 
+0

Vous avez probablement raison Alasdair, à propos des noms associés et de la symétrie, la seule raison pour laquelle ils sont là est parce que j'expérimentais juste avec différentes propriétés pour voir si cela les ferait tiquer. Et il semblerait que ce changement est en effet dans le coffre, et non communiqué. Merci pour l'aide! –

+1

Ce changement est dans la version 1.2+ –

1

Bien que ce ne soit peut-être pas la cause de votre erreur, les espaces dans l'attribut related_name ne sont pas valides, donc j'essaierai de les supprimer en premier.

"genre" => "type_wanted"

"créateur de liste" => "wishlist_creator"

+2

Je pense que l'OP peut avoir mal compris à quoi sert l'attribut 'related_name'. J'attendrais les noms comme 'wishlist' ou' wanteditems'. – Alasdair