2010-05-29 7 views
5

Ich versuche, eine Benutzer - UserProfile Beziehung einzurichten, das Formular anzuzeigen und die Daten zu speichern.Django, ModelForms, User und UserProfile - Hashing nicht Passwort

Bei der Übermittlung werden die Daten gespeichert, außer Das Passwortfeld wird nicht gehashed.

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

Antwort

8

EDIT: die ursprüngliche Frage bearbeitet wurde, nachdem diese Antwort geschrieben wurde

das Kennwort für einen Benutzer festlegen, können Sie nicht festlegen profile.user.password = new_password - das ist Was macht eine Modellform in diesem Fall? das wird es direkt als den unverhüllten Wert setzen.

Sie müssen die richtige API zum Festlegen eines Kennworts verwenden. Also, bevor profile.save() Put:

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

Um die help_text zu töten, entweder verwenden Sie nicht den schnellen form.as_foo Renderer, oder das Feld außer Kraft setzen eine help_text keines zu haben, in Ihrem den Modelform init() Methode (siehe die Django Formulare Dokumente) a

8

Okay, um meine eigene Frage zu beantworten. Dies könnte für andere nützlich sein.

Folgendes der UserForm Klasse

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 
hinzufügen
Verwandte Themen