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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-16 10:38:03212parcourir

How to Filter ForeignKey Choices in Django ModelForms?

Django ModelForm Filtrage des choix de clés étrangères

Introduction

Lors de la création de formulaires dans Django, il peut Il serait souhaitable de limiter les choix présentés aux utilisateurs pour un domaine spécifique en fonction de certains critères. Cela peut être particulièrement utile dans les scénarios impliquant des données hiérarchiques, comme lors de la sélection d'une clé étrangère.

Étude de cas : Sélection de choix de clé étrangère dans un ModelForm

Considérons un cas hypothétique Projet Django avec les modèles suivants :

class Company(models.Model):
    name = ...

class Rate(models.Model):
    company = models.ForeignKey(Company)
    name = ...

class Client(models.Model):
    name = ...
    company = models.ForeignKey(Company)
    base_rate = models.ForeignKey(Rate)

Dans ce cas, chaque entreprise a plusieurs tarifs et clients. Chaque client doit avoir un tarif de base choisi parmi les tarifs de sa société mère, et non parmi les tarifs d'une autre entreprise.

Limiter les choix de clés étrangères à l'aide du filtrage QuerySet

Pour limiter les choix pour le tarif du formulaire Client aux seuls tarifs associés à l'entreprise sélectionnée, nous pouvons modifier notre classe ClientForm comme suit :

class ClientForm(ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'base_rate']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['base_rate'].queryset = Rate.objects.filter(company_id=self.instance.company_id)

Dans ce code, nous récupérons l'ID de l'entreprise de l'instance associée au formulaire. Cela garantit que les choix de tarifs sont filtrés en fonction de la bonne entreprise.

Notes supplémentaires

  • Cette approche est compatible avec Django 1.0 et versions ultérieures.
  • L'argument limit_choices_to de ForeignKeyField est conçu pour être utilisé dans l'interface d'administration de Django et peut ne pas toujours être adapté à une utilisation dans les formulaires.
  • Pour des scénarios de filtrage plus complexes, il peut être nécessaire de remplacer la méthode get_queryset de la classe ModelChoiceField.

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