decir que tengo el siguiente en mi models.py
:¿Cómo puedo filtrar las opciones de ForeignKey en un 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)
es decir, hay múltiples Companies
, cada uno con un rango de Rates
y Clients
. Cada Client
debe tener una base Rate
que se elija de su matriz Company's Rates
, no otra Company's Rates
.
Al crear un formulario para añadir un Client
, me gustaría quitar los Company
opciones (como que ya ha sido seleccionado a través de un botón "Añadir cliente" en la página Company
) y limitar los Rate
opciones para que Company
así .
¿Cómo hago esto en Django 1.0?
Mi actual archivo forms.py
es repetitivo en la actualidad
from models import *
from django.forms import ModelForm
class ClientForm(ModelForm):
class Meta:
model = Client
Y el views.py
también es básico:
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})
En Django 0,96 pude cortar esto en haciendo algo como lo siguiente antes de representar la plantilla:
manipulator.fields[0].choices = [(r.id,r.name) for r in Rate.objects.filter(company_id=the_company.id)]
ForeignKey.limit_choices_to
parece prometedor, pero no sé cómo pasar the_company.id
y no estoy seguro si eso funcionará fuera de la interfaz de administración de todos modos.
Gracias. (Esto parece una solicitud bastante básica, pero si debería rediseñar algo, estoy abierto a sugerencias.)
Ok, que los sonidos prometedor. ¿Cómo accedo al objeto Field relevante? form.company.QuerySet = Rate.objects.filter (company_id = the_company.id)? o a través de un diccionario? – Tom
Ok, gracias por ampliar el ejemplo, pero parece que tengo que usar form.fields ["rate"]. Queryset para evitarlo "El objeto 'ClientForm' no tiene atributo 'rate'", ¿me falta algo? (y su ejemplo debe ser form.rate.queryset para ser coherente también.) – Tom
Excelente, gracias por aclarar. Para referencia futura, puede valer la pena tener en cuenta cuando editas tu respuesta a través de un comentario porque las modificaciones no se muestran en la pestaña de respuestas de mi página de usuario. – Tom