Nói rằng tôi đã điều sau đây trong models.py
tôi:Làm cách nào để lọc các lựa chọn ForeignKey trong một 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)
Tức là có nhiều Companies
, mỗi dải có một dải là Rates
và Clients
. Mỗi Client
phải có một cơ sở Rate
được chọn từ số gốc là Company's Rates
, không phải là một số Company's Rates
khác.
Khi tạo một form để thêm một Client
, tôi muốn loại bỏ các Company
lựa chọn (như đã được lựa chọn thông qua một nút "Add Client" trên trang Company
) và hạn chế Rate
lựa Company
đó là tốt .
Tôi làm cách nào để thực hiện điều này trong Django 1.0?
hiện forms.py
tập tin của tôi chỉ là soạn sẵn tại thời điểm này:
from models import *
from django.forms import ModelForm
class ClientForm(ModelForm):
class Meta:
model = Client
Và views.py
cũng là cơ bản:
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})
Trong Django 0,96 tôi đã có thể hack này trong bằng cách làm một cái gì đó như các nội dung sau đây trước khi hiển thị mẫu:
manipulator.fields[0].choices = [(r.id,r.name) for r in Rate.objects.filter(company_id=the_company.id)]
ForeignKey.limit_choices_to
có vẻ đầy hứa hẹn nhưng tôi không biết cách vượt qua trong the_company.id
và tôi không rõ liệu điều đó có hoạt động bên ngoài giao diện Quản trị hay không.
Cảm ơn. (Điều này có vẻ như một yêu cầu khá cơ bản nhưng nếu tôi nên thiết kế lại một cái gì đó tôi đang mở để gợi ý.)
Ok, mà âm thanh đầy hứa hẹn. Làm cách nào để truy cập đối tượng Field có liên quan? form.company.QuerySet = Rate.objects.filter (company_id = the_company.id)? hoặc thông qua một từ điển? – Tom
Ok, cảm ơn vì đã mở rộng ví dụ, nhưng tôi dường như phải sử dụng form.fields ["rate"]. Queryset để tránh đối tượng "ClientForm" không có thuộc tính 'rate' ", tôi có thiếu gì đó không? (và ví dụ của bạn nên được form.rate.queryset để được nhất quán quá.) – Tom
Tuyệt vời, nhờ làm rõ. Để tham khảo trong tương lai, có thể đáng chú ý khi bạn chỉnh sửa câu trả lời của mình qua nhận xét vì các chỉnh sửa không hiển thị trong tab phản hồi của trang người dùng của tôi. – Tom