2009-09-30 11 views
7

मैं क्या मैं एक साधारण समस्या नहीं होनी चाहिए लगता है। मेरे पास एक इनलाइन मॉडल फॉर्मेट है, और मैं एक चुनिंदा फ़ील्ड को वर्तमान में लॉग इन उपयोगकर्ता का डिफ़ॉल्ट चयनित मान बनाना चाहता हूं। ध्यान में रखते हुए मैं Django के प्रमाणीकरण मिडलवेयर उपयोग कर रहा हूँ, तो उपयोगकर्ता हो रही request.user तक पहुँचने का एक सरल बात है।Django: कैसे एक इनलाइन मॉडल formset में एक क्षेत्र के लिए प्रारंभिक मान सेट करने के?

क्या मैं यह पता लगाने के लिए सक्षम नहीं किया गया है, हालांकि, एक का चयन करें बॉक्स (ModelChoiceField) उपयोगकर्ताओं की सूची से युक्त में डिफ़ॉल्ट चयनित मान के रूप में है कि उपयोगकर्ता सेट करने का तरीका है। क्या कोई मुझे इस बारे में सहायता कर सकता है?

उत्तर

4

मैं कैसे इनलाइन formsets में इस संभाल करने के लिए यकीन नहीं है, लेकिन निम्न दृष्टिकोण सामान्य फार्म और ModelForms के लिए काम करेंगे:

आप मॉडल परिभाषा के भाग के रूप में इस सेट नहीं कर सकते, लेकिन आप सेट कर सकते हैं यह फॉर्म प्रारंभिकरण के दौरान:

def __init__(self, logged_in_user, *args, **kwargs): 
    super(self.__class__, self).__init__(*args, **kwargs) 
    self.fields['my_user_field'].initial = logged_in_user 

... 

form = MyForm(request.user) 
+0

सुनिश्चित नहीं हैं कि यह कैसे इनलाइन formset के साथ काम करेगा। मैं अपने स्वरूप बनाने के लिए inlineformset_factory का उपयोग कर रहा हूं और इसे फॉर्म क्लास पास कर रहा हूं, उदाहरण नहीं। इसलिए मैं सीधे किसी फॉर्म ऑब्जेक्ट को तुरंत चालू नहीं कर रहा हूं और यह नहीं जानता कि मैं इसे कन्स्ट्रक्टर पैरामीटर कैसे पास करूंगा। – Jeff

+0

हममम ... मेरा मानना ​​है कि ModelForms 'डिफ़ॉल्ट' मूल्य ले जाएगा, नहीं वे? और जब आप जानते हैं कि मानक फॉर्म फ़ील्ड प्रारंभिक उपयोग करते हैं, लेकिन जहां तक ​​मुझे पता है कि सुपर() पर जाने का कोई कारण नहीं है। – monkut

+0

यह बहुत अच्छा है! मैं फ़ॉर्म से डेटा को देखने के लिए एक तरीका ढूंढ रहा था ताकि मैं स्थिति भेज सकूं जो संदेश ढांचे का उपयोग करके प्रदर्शित किया जाएगा। प्रपत्र में मैंने प्रारंभिक कीवर्ड का उपयोग किया था, और उसके बाद मैंने इसे सत्यापित किया: cur_key_status = form.cleaned_data ['key_status'] messages.success (request, cur_key_status) – radtek

4

यह चाल है। यह सभी "अतिरिक्त" रूपों के प्रारंभिक मूल्यों को सेट करके काम करता है।

formset = MyFormset(instance=myinstance) 
user = request.user 
for form in formset.forms: 
    if 'user' not in form.initial: 
     form.initial['user'] = user.pk 
0

मैं रूण Kaagaard के विचार का उपयोग कर रहा से ऊपर, को छोड़कर मैंने देखा है कि formsets एक extra_forms संपत्ति प्रदान करते हैं: django.forms.formsets code

@property 
def extra_forms(self): 
    """Return a list of all the extra forms in this formset.""" 
    return self.forms[self.initial_form_count():] 

तो, ऊपर के उदाहरण के साथ चिपके हुए:

formset = MyFormset(instance=myinstance) 
user = request.user 
for form in formset.extra_forms: 
    form.initial['user'] = user.pk 

बचाता है किसी भी प्रारंभिक रूपों का परीक्षण करने के लिए, केवल अतिरिक्त रूपों के लिए डिफ़ॉल्ट प्रदान करें।

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