2010-12-02 3 views
3

J'ai un objet profil avec relation ManyToMany à la catégoriedjango ModelMultipleChoiceField queryset/filtre pour les objets déjà associés


class Profile(models.Model): 
    . . . 
    category = models.ManyToManyField(Category, blank=True) 

Dans ma forme, je veux afficher une case à cocher uniquement des catégories associées au profil Le code ci-dessous affichera toutes les catégories.


class ProfileForm(ModelForm): 
    . . . 
    category = forms.ModelMultipleChoiceField(Category.objects.all(), 
        widget=forms.CheckboxSelectMultiple()) 

Comment écrire un jeu de requête afin d'afficher uniquement les catégories associées au profil? J'ai variations de ceci:


    category = forms.ModelMultipleChoiceField(Category.objects.filter(id__in=Profile.category.all()), widget=forms.CheckboxSelectMultiple()) 

A cette erreur: objet « ReverseManyRelatedObjectsDescriptor » n'a pas d'attribut « all »

+0

Nevermind: Je dois définir le jeu de requête dans la vue. I gues sit est lié à la variable d'exécution form.fields ["category"]. Queryset = Category.objects.filter (profile = profile) –

Répondre

0

Pour autant que je sache, la relation « catégorie » ne peut être associé d'une Profil instance (donnant les catégories associées), pas du profil de classe lui-même. C'est pourquoi vous obtenez le message d'erreur.

Si vous substituez Profile dans votre exemple avec l'instance de Profile réelle (que je lis, c'est ce que vous essayez réellement d'obtenir), cela fonctionnerait mieux.

category=forms.ModelMultipleChoiceField(
    Category.objects.filter(id__in=your_profile_instance.category.all()), 
    widget=forms.CheckboxSelectMultiple() 
) 

ou tout simplement

category=forms.ModelMultipleChoiceField(
    queryset=your_profile_instance.category.all()), 
    widget=forms.CheckboxSelectMultiple() 
) 

Ai-je bien compris votre question?

Questions connexes