Frage

Dieses Problem ist sehr seltsam, und ich hoffe, jemand kann mir helfen. Aus Gründen der Argumentation, habe ich einen Autor Modell mit ForeignKey Beziehung zum Buch Modell. Wenn ich einen Autor anzuzeigen, würde Ich mag ein ChoiceField haben, der die Bücher von Displays mit diesem Autor katalogisiert. Als solches überschreiben ich die AuthorForm. init () -Methode und ich eine Liste der Entscheidungen (Tupeln), basierend auf einer Abfrage, die Bücher auf der Basis der Autor ID filtert. Das Tupel ist ein Verbund aus dem Buch-ID und die Buchnamen (d.h., (1, ‚Moby Dick‘)). Diese „Auswahl“ werden dann an die Modelform der Auswahl zugewiesen Attribut.

Wenn das Formular in der Vorlage macht, wird die ChoiceField richtig angezeigt wird, nur mit diesem Autor katalogisiert diese Bücher auflistet.

Dies ist, wo die Dinge seltsam erhalten.

Wenn ich das Formular speichern, erhalte ich ein Valueerror (kann nicht „U'1' ‚zuweisen: Author.book‘muss ein Buch Beispiel sein) Dieser Fehler Sinn aufgrund der FK Beziehung macht Allerdings, wenn ich ein hinzufügen.. „print“ Anweisung an den Code, keine weiteren Änderungen vornehmen und dann den Datensatz speichern, es funktioniert. der Valueerror verschwindet magisch. ich habe dies einige Male versucht, um sicherzustellen, ich habe nicht versehentlich eine andere Änderung vorgenommen, und es funktioniert jedes Mal.

Wer weiß, was hier vor sich geht?

War es hilfreich?

Lösung

Nicht ganz sicher, was Sie falsch machen, aber es ist am besten, nur die queryset zu ändern:

class ClientForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.affiliate = kwargs.pop('affiliate')
        super(ClientForm, self).__init__(*args, **kwargs)
        self.fields["referral"].queryset = Referral.objects.filter(affiliate = self.affiliate)

    class Meta:
        model = Client

Die oben ist gerade aus einem meiner Projekte und es funktioniert perfekt, um nur die Referral Objekte an die weitergegeben Affiliate Zusammenhang zeigen:

form = ClientForm(affiliate=request.affiliate)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top