2012-05-13 4 views
8

Ich möchte ein EINZELN Formular erstellen, die die Möglichkeit für den Administrator gibt, einen neuen Benutzer mit erweitertem Profil zu erstellen. Bitte beachten Sie, dass ich keine Admin- und Registrierungs-Apps verwenden möchte. Ich habe den Benutzer mit dem UserProfile-Modell erweitert. Ich habe alle Dokumente zur Erweiterung des Benutzerprofils gelesen. Aber ich weiß wirklich nicht, wie ich diese Informationen speichern soll. I codiert die folgende django Form für dieses Problem:Erstellen eines Benutzerformulars in Django hinzufügen

class CreateUserForm(forms.Form): 
username = forms.CharField(max_length=30) 
first_name = forms.CharField() 
last_name = forms.CharField() 
password1=forms.CharField(max_length=30,widget=forms.PasswordInput()) #render_value=False 
password2=forms.CharField(max_length=30,widget=forms.PasswordInput()) 
email=forms.EmailField(required=False) 

title = forms.ChoiceField(choices=TITLE_CHOICES) 

def clean_username(self): # check if username dos not exist before 
    try: 
     User.objects.get(username=self.cleaned_data['username']) #get user from user model 
    except User.DoesNotExist : 
     return self.cleaned_data['username'] 

    raise forms.ValidationError("this user exist already") 


def clean(self): # check if password 1 and password2 match each other 
    if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:#check if both pass first validation 
     if self.cleaned_data['password1'] != self.cleaned_data['password2']: # check if they match each other 
      raise forms.ValidationError("passwords dont match each other") 

    return self.cleaned_data 


def save(self): # create new user 
    new_user=User.objects.create_user(username=self.cleaned_data['username'], 
            first_name=self.cleaned_data['first_name'], 
            last_name=self.cleaned_data['last_name'], 
            password=self.cleaned_data['password1'], 
            email=self.cleaned_data['email'], 
             ) 

    return new_user 

Ist es OK? aber es gibt mir einen Fehler in First_name und last_name. Sagt, dass django in der Methode save() keinen First_name und Last_name erwartet.

+0

Ich bin nicht sicher, dass Sie Zugriff auf die 'save' Methode über ein normales Formular haben. Es ist sicher in der Modellform verfügbar https://docs.djangoproject.com/de/dev/topics/forms/modelforms/#the-save-method – super9

Antwort

13

create_user unterstützt nur die Argumente Benutzername, E-Mail und Kennwort. Rufen Sie zuerst create_user auf und fügen Sie dann dem gespeicherten Objekt die zusätzlichen Werte hinzu.

new_user=User.objects.create_user(self.cleaned_data['username'], 
            self.cleaned_data['email'], 
            self.cleaned_data['password1']) 
new_user.first_name = self.cleaned_data['first_name'] 
new_user.last_name = self.cleaned_data['last_name'] 
new_user.save() 
+0

Sie haben Recht. Was ist mit anderen Benutzerprofilfeldern? Muss ich sie wie Benutzerfelder speichern? BTW, ich möchte sicherstellen, dass ich die richtige Lösung dafür gewählt habe. Also, ist es richtig? –

+6

Wenn Sie Felder wie 'Firma' und 'Adresse' meinen, können Sie ein UserProfile-Modell erstellen, das eine Eins-zu-Eins-Beziehung mit dem Benutzer hat (https://docs.djangoproject.com/en/dev/topics/auth/# Auth-Profile). Auf diese Weise können Sie beliebig viele Felder hinzufügen und mit user.get_profile(). Company abrufen –