कहें कि मेरे पास models.py
में निम्न है:मैं Django ModelForm में ForeignKey विकल्पों को कैसे फ़िल्टर करूं?
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. कई 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
में कैसे पास किया जाए और मैं स्पष्ट नहीं हूं कि यह व्यवस्थापक इंटरफ़ेस के बाहर काम करेगा या नहीं।
धन्यवाद। (यह एक बहुत ही बुनियादी अनुरोध की तरह लगता है लेकिन अगर मुझे कुछ नया स्वरूप देना चाहिए तो मैं सुझावों के लिए खुला हूं।)
ठीक है, कि लगता है: उदाहरण के लिए यहाँ के लिए मैं एक क्षेत्र, फार्म का है कि get_list (अनुरोध) से कई टर्मिनल आइटम चुनने के लिए विशेष मामलों में इस्तेमाल किया जा सकता पर '_terminal_list' कहा जाता है तो request.user के आधार पर फ़िल्टरिंग होनहार। मैं प्रासंगिक फ़ील्ड ऑब्जेक्ट का उपयोग कैसे करूं? form.company.QuerySet = Rate.objects.filter (company_id = the_company.id)? या एक शब्दकोश के माध्यम से? – Tom
ठीक है, उदाहरण का विस्तार करने के लिए धन्यवाद, लेकिन मुझे फॉर्म.फील्ड ["दर"] का उपयोग करना प्रतीत होता है। "क्लाइंटफॉर्म" ऑब्जेक्ट से बचने के लिए क्वेरीसेट में कोई विशेषता 'दर' नहीं है, क्या मुझे कुछ याद आ रहा है? (और आपका उदाहरण form.rate.queryset भी होना चाहिए।) – Tom
उत्कृष्ट, स्पष्टीकरण के लिए धन्यवाद। भविष्य के संदर्भ के लिए, जब आप टिप्पणी के माध्यम से अपना उत्तर संपादित करते हैं तो यह ध्यान देने योग्य हो सकता है क्योंकि संपादन मेरे उपयोगकर्ता पृष्ठ के प्रतिक्रिया टैब में दिखाई नहीं देता है। – Tom