2010-01-02 16 views
17

पर ** kwargs पास करना मैं एप्लिकेशन के लिए उपयोगकर्ता नाम और उपयोगकर्ता ईमेल बदलने के लिए कस्टम django रूप बनाने की कोशिश कर रहा हूं। यही कारण है कि लॉग इन उपयोगकर्ता मौजूद है या नहीं, यह जांचने के लिए कि मुझे सत्र से उपयोगकर्ता विवरण को एक फॉर्म में पास करने की आवश्यकता है। एक शब्दकोशDjango फॉर्म

views.py

personal_info_form = PersonalInfoForm(prefix='personal_info', 
             user_details=user_details) 

जहां user_details में

है:: मैं इस तरह से कर रहा हूँ

'user_details': [{'username': u'username', 
        'registration_date': datetime.date(2009, 10, 22), 
        'id': 13, 'email': u'[email protected]'}]} 

forms.py में मैं निम्नलिखित कोड है:

class PersonalInfoForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     user_details = kwargs.pop('user_details', None) 
     super(PersonalInfoForm, self).__init__(*args, **kwargs) 

    username = forms.CharField(required=True, initial=user_details[0]['username']) 
    email = forms.EmailField(required=True) 

और मुझे निम्न त्रुटि मिलती है:

name 'user_details' is not defined 

मैं self.user_details और केवल user_details साथ उस तक पहुंचने में की कोशिश की और यह मेरे लिए एक ही त्रुटि

उत्तर

29

user_details__init__ पर पास किया गया है, इसलिए इसके बाहर परिभाषित नहीं किया गया है। यही कारण है कि जब आप CharField ऑब्जेक्ट को instatiating कर रहे हैं तो आप इसका उपयोग नहीं कर सकते हैं। __init__ अपने आप में initial सेट करें, के बाद आप इसे kwargs से पॉपअप किया है, उदाहरण के लिए:

class PersonalInfoForm(forms.Form): 

    username = forms.CharField(required=True) 
    email = forms.EmailField(required=True) 

    def __init__(self, *args, **kwargs): 
     user_details = kwargs.pop('user_details', None) 
     super(PersonalInfoForm, self).__init__(*args, **kwargs) 
     if user_details: 
      self.fields['username'].initial = user_details[0]['username'] 

जब आप एक मौका मिलता है, scopes in python पर पढ़ने पर विचार करें।

+1

+1 सुंदर। मेरे बहुत ही समान समाधान जमा करने से पहले 10 सेकंड, नारंगी बैनर पॉप अप ... अच्छी तरह से किया गया! – czarchaic

+0

धन्यवाद, मैं अभी स्कॉप्स के बारे में पढ़ रहा हूं :) –

2

आप व्याख्या कर सकते हैं देता है एक और अधिक स्पष्ट जिस तरह से आप क्या करने की कोशिश कर रहे हैं में? मेरा मानना ​​है कि आप जो कर रहे हैं वह अनावश्यक है। सुनिश्चित नहीं हैं कि अगर मैं तुम्हें समझ में आया, लेकिन Django मॉडल फार्म पर एक नज़र डालें: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

>>> from django.forms import ModelForm 

# Create the form class. 
>>> class ArticleForm(ModelForm): 
...  class Meta: 
...   model = Article 

# Creating a form to add an article. 
>>> form = ArticleForm() 

# Creating a form to change an existing article. 
>>> article = Article.objects.get(pk=1) 
>>> form = ArticleForm(instance=article) 

यदि यह आप के लिए, आप आसानी से अपने उपयोगकर्ता मॉडल का उपयोग करने के addapt सकता है क्या देख रहे है। याद रखें, आप चुन सकते हैं कि आप कौन से फ़ील्ड को बदलना चाहते हैं। instance पैरामीटर प्रारंभिक फ़ील्ड मान सेट करता है (जो मैं समझता हूं कि आप करना चाहते हैं)। उपर्युक्त उदाहरण सभी फ़ील्ड दिखाएगा, नीचे दिया गया उदाहरण दिखाता है कि केवल 2 फ़ील्ड कैसे प्रदर्शित करें।

class PartialAuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title') 

आशा है कि मैंने मदद की है।

+0

मैं फॉर्म वर्ग में ** kwargs से चरों तक पहुंचने का प्रयास कर रहा हूं। –

+1

क्या आपने कोशिश की है: 'kwargs [' user_details '] '? – Clash

+0

हां। यह मुझे नाम 'kwargs' परिभाषित नहीं किया गया है –

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