2010-05-29 45 views
5

Tôi đang cố thiết lập mối quan hệ Người dùng - UserProfile, hiển thị biểu mẫu và lưu dữ liệu.Django, ModelForms, Người dùng và UserProfile - không băm mật khẩu

Khi được gửi, dữ liệu được lưu, ngoại trừ trường mật khẩu không bị băm.

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'] 

Trả lời

8

EDIT: câu hỏi ban đầu đã được chỉnh sửa sau khi câu trả lời này đã được viết

Để đặt mật khẩu cho người dùng, bạn không đặt profile.user.password = new_password - đó là những gì sử dụng một dạng mẫu trong trường hợp này đang làm; sẽ đặt trực tiếp giá trị đó.

Bạn cần sử dụng API thích hợp để đặt mật khẩu. Vì vậy, trước khi profile.save() đặt:

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

Để giết help_text, hoặc là không sử dụng các renderer form.as_foo nhanh chóng, hoặc ghi đè lĩnh vực này để có một help_text của none trong của ModelForm của bạn init() phương pháp (xem tài liệu biểu mẫu Django) a

8

Được rồi, để trả lời câu hỏi của riêng tôi. Điều này có thể có ích cho người khác.

Thêm dòng sau vào lớp 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 
Các vấn đề liên quan