Как мне отфильтровать выбор ForeignKey в Django ModelForm?

Скажем, у меня есть следующее в моем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)

То есть Есть несколькоCompaniesкаждый из которых имеет диапазонRates а такжеClients, каждыйClient должен иметь базуRate который выбран из его родителяCompany's Rates, не другойCompany's Rates.

При создании формы для добавленияClientЯ хотел бы удалитьCompany варианты (поскольку это уже было выбрано с помощью кнопки «Добавить клиента» наCompany страница) и ограничитьRate выбор к этомуCompany также.

Как мне это сделать в Django 1.0?

Мой текущийforms.py На данный момент файл просто шаблонный:

from models import *
from django.forms import ModelForm

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

Иviews.py также является основным:

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

В Django 0.96 я смог взломать это, выполнив что-то вроде следующего перед рендерингом шаблона:

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

ForeignKey.limit_choices_to кажется многообещающим, но я не знаю, как пройти вthe_company.id и я не уверен, будет ли это работать вне интерфейса администратора в любом случае.

Благодарю. (Это кажется довольно простой просьбой, но если мне нужно что-то изменить, я открыт для предложений.)

Ответы на вопрос(1)

Ваш ответ на вопрос