Comment puis-je filtrer ForeignKey choix dans un Django ModelForm?

Dire que j'ai la suite dans ma models.py:

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)

I. e. il y a plusieurs Companies, ayant chacun une gamme de Rates et Clients. Chaque Client devrait avoir une base Rate qui est choisi à partir de celle du parent Company's Rates, pas un autre Company's Rates.

Lors de la création d'un formulaire pour l'ajout d'un Client, je voudrais enlever la Company choix (comme cela a déjà été sélectionné en passant par un "Client" sur le bouton de Company page) et de limiter le Rate choix que Company ainsi.

Comment puis-je aller à ce sujet dans Django 1.0?

Mon forms.py fichier est juste réutilisable à l'instant:

from models import *
from django.forms import ModelForm

class ClientForm(ModelForm):
    class Meta:
        model = Client

Et la views.py est également de base:

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})

Dans Django 0.96 j'ai été en mesure de pirater ce en en faisant quelque chose comme ce qui suit avant de rendre le modèle:

manipulator.fields[0].choices = [(r.id,r.name) for r in Rate.objects.filter(company_id=the_company.id)]

ForeignKey.limit_choices_to semble prometteur, mais je ne sais pas comment passer en the_company.id et je ne suis pas clair si ce sera de travailler à l'extérieur de l'interface d'administration de toute façon.

Grâce. (Cela semble assez simple demande, mais si je dois redessiner quelque chose je suis ouvert aux suggestions.)

InformationsquelleAutor Tom | 2008-11-15