एक रूप में एक विदेशी कुंजी क्षेत्र प्रदर्शित आप forms.ModelChoiceField
उपयोग करें और यह एक क्वेरीसमूह पारित कर सकते हैं के संबंध में।
तो
, forms.py:
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
def __init__(self, *args, **kwargs):
user = kwargs.pop('user','')
super(DocumentForm, self).__init__(*args, **kwargs)
self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user))
views.py:
def someview(request):
if request.method=='post':
form=DocumentForm(request.POST, user=request.user)
if form.is_valid():
selected_user_defined_code = form.cleaned_data.get('user_defined_code')
#do stuff here
else:
form=DocumentForm(user=request.user)
context = { 'form':form, }
return render_to_response('sometemplate.html', context,
context_instance=RequestContext(request))
अपने प्रश्न से
:
मैं एक दृश्य में पता है कि तुम उपयोग कर सकते हैं document.code_set (उदाहरण के लिए) वर्तमान दस्तावेज़ ऑब्जेक्ट के लिए संबंधित ऑब्जेक्ट्स तक पहुंचें, लेकिन मैं ' नहीं है कि मॉडलफॉर्म पर इसे कैसे लागू करें।
वास्तव में, अपने Document
वस्तुओं एक .code_set
के बाद से FK संबंध अपने दस्तावेज़ों मॉडल में परिभाषित किया गया है नहीं होगा। यह Code
पर कई से एक रिश्ते को परिभाषित कर रहा है, जिसका अर्थ है कि Document
ऑब्जेक्ट प्रति Code
ऑब्जेक्ट हो सकता है, न कि दूसरी तरफ। आपके Code
ऑब्जेक्ट्स में .document_set
होगा। दस्तावेज़ ऑब्जेक्ट से आप क्या कर सकते हैं वह एक्सेस है जो Code
यह document.code
का उपयोग करने से संबंधित है।
संपादित करें: मुझे लगता है कि यह वही करेगा जो आप खोज रहे हैं। (Untested)
forms.py:
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
exclude = ('code',)
def __init__(self, *args, **kwargs):
user = kwargs.pop('user','')
super(DocumentForm, self).__init__(*args, **kwargs)
self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user))
self.fields['unique_code']=forms.CharField(max_length=15)
views.py:
def someview(request):
if request.method=='post':
form=DocumentForm(request.POST, user=request.user)
if form.is_valid():
uniquecode = form.cleaned_data.get('unique_code')
user_defined_code = form.cleaned_data.get('user_defined_code')
doc_code = Code(user_defined_code=user_defined_code, code=uniquecode)
doc_code.save()
doc = form.save(commit=False)
doc.code = doc_code
doc.save()
return HttpResponse('success')
else:
form=DocumentForm(user=request.user)
context = { 'form':form, }
return render_to_response('sometemplate.html', context,
context_instance=RequestContext(request))
वास्तव में आप शायद जब अपने कोड वस्तु इस के बजाय बनाने get_or_create उपयोग करना चाहते हैं।
doc_code = Code(user_defined_code=user_defined_code, code=uniquecode)
सहायता के लिए धन्यवाद।मैंने ModelChoiceField के दस्तावेज़ों पर पढ़ा है और अब यह समझ में आता है। क्या आप जानते हैं कि मैं 'unique_code' फ़ील्ड के लिए CharField (मेरे प्रश्न में तीसरा बुलेट बिंदु) कैसे प्रदर्शित करूं? मैंने अपने मॉडलों को पढ़ने के लिए आसान बनाने के लिए थोड़ा सा पतला कर दिया है, लेकिन मूल रूप से मेरे पास एक दस्तावेज़ है जिसे कंप्यूटर से उत्पन्न, अद्वितीय दस्तावेज़ कोड असाइन किया गया है। प्रत्येक उपयोगकर्ता एक अलग उपयोगकर्ता कोड बना सकता है जो उनके सभी दस्तावेजों के लिए दस्तावेज़ कोड के उपसर्ग के रूप में संलग्न होता है, इसलिए एकाधिक मॉडलों का कारण। –
@ बेन एस ठीक है मुझे देखने दो। मैं अपनी पोस्ट संपादित करूंगा। – DTing
यह बहुत अच्छा काम किया। आपकी सहायता के लिए धन्यवाद. –