2011-04-18 9 views
18

मैं करना चाहते हैं क्या उपयोगकर्ता देता है कि एक ही रूप प्रदर्शित करने के लिए है:मैं Django में मॉडलफॉर्म में एक विदेशी कुंजी फ़ील्ड कैसे जोड़ूं?

  • एक दस्तावेज़ शीर्षक (Document मॉडल से) दर्ज
  • चयन सूची एक ड्रॉप डाउन से उनके user_defined_code विकल्पों में से एक (आबादी वाले UserDefinedCode मॉडल)
  • एक unique_code में लिखें (Code मॉडल में संग्रहित)

द्वारा मुझे यकीन है कि सामने के लिए खेतों प्रदर्शित करने के बारे में जाने के लिए कैसे नहीं कर रहा हूँ एक रूप में महत्वपूर्ण संबंधों को अनदेखा करें। मुझे एक दृश्य में पता है कि आप वर्तमान document ऑब्जेक्ट के लिए संबंधित ऑब्जेक्ट्स तक पहुंचने के लिए document.code_set (उदाहरण के लिए) का उपयोग कर सकते हैं, लेकिन मुझे यकीन नहीं है कि इसे मॉडलफॉर्म पर कैसे लागू करें।

मेरे मॉडल:

class UserDefinedCode(models.Model): 
    name = models.CharField(max_length=8) 
    owner = models.ForeignKey(User) 

class Code(models.Model): 
    user_defined_code = models.ForeignKey(UserDefinedCode) 
    unique_code = models.CharField(max_length=15) 

class Document(models.Model): 
    title = models.CharField(blank=True, null=True, max_length=200) 
    code = models.ForeignKey(Code) 
    active = models.BooleanField(default=True) 

मेरे ModelForm

class DocumentForm(ModelForm): 
    class Meta: 
     model = Document 

उत्तर

27

एक रूप में एक विदेशी कुंजी क्षेत्र प्रदर्शित आप 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) 
+0

सहायता के लिए धन्यवाद।मैंने ModelChoiceField के दस्तावेज़ों पर पढ़ा है और अब यह समझ में आता है। क्या आप जानते हैं कि मैं 'unique_code' फ़ील्ड के लिए CharField (मेरे प्रश्न में तीसरा बुलेट बिंदु) कैसे प्रदर्शित करूं? मैंने अपने मॉडलों को पढ़ने के लिए आसान बनाने के लिए थोड़ा सा पतला कर दिया है, लेकिन मूल रूप से मेरे पास एक दस्तावेज़ है जिसे कंप्यूटर से उत्पन्न, अद्वितीय दस्तावेज़ कोड असाइन किया गया है। प्रत्येक उपयोगकर्ता एक अलग उपयोगकर्ता कोड बना सकता है जो उनके सभी दस्तावेजों के लिए दस्तावेज़ कोड के उपसर्ग के रूप में संलग्न होता है, इसलिए एकाधिक मॉडलों का कारण। –

+0

@ बेन एस ठीक है मुझे देखने दो। मैं अपनी पोस्ट संपादित करूंगा। – DTing

+0

यह बहुत अच्छा काम किया। आपकी सहायता के लिए धन्यवाद. –

संबंधित मुद्दे