2010-05-29 15 views
5

मैं उपयोगकर्ता - उपयोगकर्ता प्रोफाइल संबंध स्थापित करने का प्रयास कर रहा हूं, फ़ॉर्म प्रदर्शित कर रहा हूं और डेटा को सहेज सकता हूं।Django, ModelForms, उपयोगकर्ता और UserProfile - हैशिंग पासवर्ड नहीं

सबमिट किए जाने पर, डेटा सहेजा गया है, को छोड़कर पासवर्ड फ़ील्ड को धोया नहीं जाता है।

Forms.py

class UserForm(forms.ModelForm): 
    username = forms.RegexField(label="Username", max_length=30, 
     regex=r'^[\[email protected]+-]+$', help_text = "My text", 
     error_messages = {'invalid': 
      "This value may contain only letters, numbers and @/./+/-/_ characters." 
     } 
    ) 
    password = forms.CharField(label="Password", 
           widget=forms.PasswordInput) 

    class Meta: 
     model = User 
     fields = ["first_name", "last_name", "username", "email", "password"] 

    def clean_username(self): 
     username = self.cleaned_data['username'] 
     if not re.search(r'^\w+$', username): 
      raise forms.ValidationError(
        'Username can contain only alphanumeric characters') 
     try: 
      User.objects.get(username=username) 
     except ObjectDoesNotExist: 
      return username 
     raise forms.ValidationError('Username is already taken') 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ['user_is'] 

उत्तर

8

संपादित करें: मूल प्रश्न संपादित किया गया था के बाद इस उत्तर

लिखा गया था एक उपयोगकर्ता के लिए पासवर्ड सेट करने के लिए, आप profile.user.password = new_password निर्धारित नहीं करते हैं - जो है इस मामले में एक मॉडलफॉर्म का उपयोग कर क्या कर रहा है; जो इसे सीधे अप्रशिक्षित मान के रूप में सेट करेगा।

आपको पासवर्ड सेट करने के लिए उचित API का उपयोग करने की आवश्यकता है। तो, इससे पहले कि profile.save() पुट:

profile.user.set_password(uform.cleaned_data['password'])

help_text को मारने के लिए, या तो त्वरित form.as_foo रेंडरर का उपयोग नहीं करते, या क्षेत्र को ओवरराइड अपने ModelForm के init में कोई भी एक help_text के लिए() विधि (Django फॉर्म डॉक्स देखें)

8

ठीक है, मेरे अपने प्रश्न का उत्तर देने के लिए। यह दूसरों के लिए आसान हो सकता है।

UserForm वर्ग

def save(self, commit=True): 
    user = super(UserForm, self).save(commit=False) 
    user.set_password(self.cleaned_data["password"]) 
    if commit: 
     user.save() 
    return user 
के लिए निम्न जोड़ें
संबंधित मुद्दे