Heim >Backend-Entwicklung >Python-Tutorial >Wie filtere ich ForeignKey-Auswahlmöglichkeiten in Django ModelForms?
Django ModelForm Filtering ForeignKey Choices
Einführung
Beim Erstellen von Formularen in Django ist dies möglich Es wäre wünschenswert, die Auswahlmöglichkeiten für Benutzer auf ein bestimmtes Feld basierend auf bestimmten Kriterien einzuschränken. Dies kann besonders in Szenarien mit hierarchischen Daten nützlich sein, beispielsweise bei der Auswahl eines Fremdschlüssels.
Fallstudie: Auswählen von Fremdschlüsseloptionen in einer ModelForm
Betrachten wir eine Hypothese Django-Projekt mit den folgenden Modellen:
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)
In diesem Fall hat jedes Unternehmen mehrere Tarife und Kunden. Für jeden Kunden muss ein Basistarif aus den Tarifen seiner Muttergesellschaft ausgewählt werden, nicht aus den Tarifen eines anderen Unternehmens.
Einschränken der ForeignKey-Auswahl mithilfe der QuerySet-Filterung
Um die Auswahlmöglichkeiten für den Tarif einzuschränken Um das Feld „ClientForm“ im Client-Formular nur auf die mit dem ausgewählten Unternehmen verknüpften Tarife zu beschränken, können wir unsere ClientForm-Klasse wie folgt ändern:
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)
In Mit diesem Code rufen wir die Firmen-ID aus der mit dem Formular verknüpften Instanz ab. Dadurch wird sichergestellt, dass die Tarifauswahl nach dem richtigen Unternehmen gefiltert wird.
Zusätzliche Hinweise
Das obige ist der detaillierte Inhalt vonWie filtere ich ForeignKey-Auswahlmöglichkeiten in Django ModelForms?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!