4 Stimmen

django ModelMultipleChoiceField Queryset/Filter für bereits verknüpfte Objekte

Ich habe ein Profilobjekt mit vielen Beziehungen zur Kategorie

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

In meinem Formular möchte ich ein Kontrollkästchen mit nur den Kategorien anzeigen, die mit dem Profil verbunden sind Der folgende Code zeigt alle Kategorien an.

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

Wie schreibe ich einen Abfragesatz, so dass ich nur die mit dem Profil verbundenen Kategorien anzeige? Ich habe verschiedene Varianten davon:

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

Hat diesen Fehler: 'ReverseManyRelatedObjectsDescriptor'-Objekt hat kein Attribut 'all'

0voto

kevin Punkte 1

Woa dies wurde vor 10 Jahren gefragt..aber prolly meine Idee könnte sich als nützlich erweisen, um Entwickler, die diese Überprüfung werden. Ich hatte eine ähnliche Herausforderung.

Die einfachste Möglichkeit ist, dies auszublenden:

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

lol und dann unten, nach der Auflistung der Felder hinzufügen:

widgets = {
     'category': forms.CheckboxSelectMultiple,
    }

yea....

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

-1voto

pereric Punkte 109

Soweit ich weiß, kann die Beziehung "Kategorie" nur von einem Profil aus assoziiert werden Instanz (unter Angabe der zugehörigen Kategorien), nicht von der Klasse Profil selbst. Deshalb erhalten Sie die Fehlermeldung.

Wenn Sie das Profil in Ihrem Beispiel durch die tatsächliche Profilinstanz ersetzen (was, wie ich gelesen habe, das ist, was Sie tatsächlich zu erreichen versuchen), würde es besser funktionieren.

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

oder einfach

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

Habe ich Ihre Frage richtig verstanden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X