Question

Ce problème est très étrange et j'espère que quelqu'un peut me aider. Pour les besoins du raisonnement, j'ai un modèle de l'auteur avec relation ForeignKey au modèle du livre. Quand j'afficher un auteur, je voudrais avoir une ChoiceField qui affiche uniquement les livres associés à cet auteur. En tant que tel, je le AuthorForm passer outre. Méthode init () et je crée une liste de choix (tuples) sur la base d'une requête qui filtre les livres basés sur l'ID auteur. Le tuple est un composite de l'ID de livre et le nom du livre (à savoir, (1, 'Moby Dick')). Ces « choix » sont ensuite attribués aux choix de l'ModelForm attribut.

Lorsque la forme rend dans le modèle, le ChoiceField est correctement affiché, la liste uniquement les livres associés à cet auteur.

est où les choses deviennent bizarre.

Quand je sauve la forme, je reçois un ValueError (ne peut pas affecter « U'1' « : Author.book » doit être une instance Livre) Cette erreur est logique en raison de la relation FK Cependant, si j'ajoute un.. déclaration « print » au code, apportez aucune autre modification, puis enregistrez le disque, cela fonctionne. le ValueError disparaît comme par magie. J'ai essayé ce plusieurs fois, je ne l'ai pas assurer, par inadvertance, fait un autre changement, et cela fonctionne à chaque fois.

Quelqu'un sait ce qui se passe ici?

Était-ce utile?

La solution

Pas tout à fait sûr de ce que vous faites mal, mais il est préférable de modifier juste le queryset:

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

Ce qui précède est tout droit sorti d'un de mes projets et il fonctionne parfaitement pour montrer que les objets d'orientation liés à la filiale passé:

form = ClientForm(affiliate=request.affiliate)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top