Maison  >  Article  >  développement back-end  >  Comment filtrer les choix de clés étrangères dans un ModelForm Django ?

Comment filtrer les choix de clés étrangères dans un ModelForm Django ?

DDD
DDDoriginal
2024-11-17 02:44:03783parcourir

How to Filter ForeignKey Choices in a Django ModelForm?

Adaptation des choix de clé étrangère dans un formulaire de modèle Django

Contexte

Dans les modèles Django, une clé étrangère définit une relation entre deux modèles. Cette documentation montre comment filtrer les choix disponibles pour un champ ForeignKey dans un Django ModelForm, en garantissant que seules les options pertinentes sont présentées.

Filtrage des choix de clé étrangère

Dans le scénario donné, vous souhaitez créer un formulaire pour ajouter des clients liés à une entreprise spécifique. La base_rate ForeignKey du Client ne doit afficher que les Tarifs associés à la Société en question. Pour y parvenir avec Django 1.0, suivez ces étapes :

  1. Dans la fonction d'affichage, avant de restituer le modèle de formulaire, définissez l'attribut queryset du champ ForeignKey souhaité sur le QuerySet filtré :
form.fields["base_rate"].queryset = Rate.objects.filter(company_id=the_company.id)

Cet ensemble de requêtes garantit que seuls les tarifs liés à la société sélectionnée seront disponibles comme choix dans le form.

Django 0.96 Hack

La solution publiée pour Django 0.96 est en effet un hack qui contourne la fonctionnalité native des formulaires Django. Il modifie directement l'attribut de choix du champ ForeignKey, ce qui peut conduire à des incohérences et n'est pas recommandé pour le code de production.

ModelChoiceField Queryset

La documentation de Django indique clairement que les choix d'un ModelChoiceField sont définis par son attribut queryset. En définissant explicitement cet attribut sur le QuerySet approprié, vous pouvez adapter les choix de clé étrangère au sous-ensemble d'objets souhaité. Cette méthode évite tout piratage et garantit une approche propre et maintenable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn