Sagen wir, ich habe folgendes in meinem models.py
:Wie filtere ich ForeignKey-Auswahlen in einem Django ModelForm?
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)
D.h. es gibt mehrere Companies
, die jeweils einen Bereich von Rates
und Clients
haben. Jede Client
sollte eine Basis Rate
haben, die aus ihrer ursprünglichen , nicht anderen Company's Rates
gewählt wird.
Wenn das Erstellen eines Formulars eine Client
für das Hinzufügen, ich möchte die Company
Auswahl entfernen (wie die bereits über einen „Add Client“ auf der Company
Seite ausgewählt wurde) und begrenzen die Rate
Entscheidungen zu diesem Company
auch .
Wie gehe ich darüber in Django 1.0?
Meine aktuelle forms.py
Datei ist nur vorformulierten im Moment:
from models import *
from django.forms import ModelForm
class ClientForm(ModelForm):
class Meta:
model = Client
Und die views.py
ist auch Grund:
from django.shortcuts import render_to_response, get_object_or_404
from models import *
from forms import *
def addclient(request, company_id):
the_company = get_object_or_404(Company, id=company_id)
if request.POST:
form = ClientForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(the_company.get_clients_url())
else:
form = ClientForm()
return render_to_response('addclient.html', {'form': form, 'the_company':the_company})
In Django 0,96 Ich konnte dies etwas, indem Sie hacken in wie Folgendes vor dem Rendern der Vorlage:
manipulator.fields[0].choices = [(r.id,r.name) for r in Rate.objects.filter(company_id=the_company.id)]
ForeignKey.limit_choices_to
scheint vielversprechend, aber ich weiß nicht, wie man the_company.id
weitergeben und ich bin nicht klar, ob das sowieso außerhalb der Admin-Schnittstelle funktioniert.
Danke. (Dies scheint eine ziemlich einfache Anfrage zu sein, aber wenn ich etwas neu gestalten sollte, bin ich offen für Vorschläge.)
Ok, das klingt vielversprechend. Wie greife ich auf das relevante Field-Objekt zu? form.company.QuerySet = Rate.objects.filter (company_id = die_firma.id)? oder über ein Wörterbuch? – Tom
Ok, danke für die Erweiterung des Beispiels, aber ich scheine form.fields ["rate"] zu verwenden. Querieset um zu vermeiden, '' ClientForm 'Objekt hat kein Attribut' rate '", fehlt mir etwas? (und Ihr Beispiel sollte auch form.rate.queryset sein, um konsistent zu sein.) – Tom
Ausgezeichnet, danke für die Klärung. Wenn Sie Ihre Antwort über einen Kommentar bearbeiten möchten, sollten Sie sie später zur Kenntnis nehmen, da Änderungen nicht auf der Registerkarte "Antworten" auf meiner Benutzerseite angezeigt werden. – Tom