2014-10-22 15 views
5

Mit Django generische CreateView kann ich ein neues Benutzerkonto erstellen, aber wie kann ich diesen Benutzer automatisch nach der Registrierung mit dieser Technik anmelden?Django: Wie Benutzer direkt nach der Registrierung mit generischen CreateView anmelden

urls.py ...
url (r '^ Anmeldungen/$', SignUpView.as_view() name = 'user_signup'), ...

views.py

class SignUpView (CreateView) :  
    form_class = AccountCreationForm 
    template_name = 'accounts/signup.html' 
    success_url = reverse_lazy('home') 

forms.py

class AccountCreationForm (forms.ModelForm) :   
    def __init__(self, *args, **kwargs) : 
     super(AccountCreationForm, self).__init__(*args, **kwargs) 
     for field in self.fields : 
      self.fields[field].widget.attrs['class'] = 'form-control' 

    password1 = forms.CharField(label = 'Password', widget = forms.PasswordInput) 
    password2 = forms.CharField(label = 'Password confirmation', widget = forms.PasswordInput) 

    class Meta : 
     model = User 
     fields = ('email', 'first_name',) 

    def clean_password2 (self) : 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password 

    def save(self, commit = True) : 
     # Save the provided password in hashed format 
     user = super(AccountCreationForm, self).save(commit = False) 
     user.set_password(self.cleaned_data[ "password1" ]) 
     if commit: 
      user.save() 
     return user 

Antwort

9

es vielleicht zu spät ist, aber das war genau meine Frage, und nach einigen Stunden des Kampfes endlich herausfinden, .

Vielleicht haben Sie gefunden, aber wenn andere Leute nach einer Lösung suchen, hier ist meins.

Sie müssen nur form_valid() in Ihrer Klasse überschreiben Erben CreateView. Hier ist das Beispiel mit meiner eigenen Klasse:

class CreateArtistView(CreateView): 
    template_name = 'register.html' 
    form_class = CreateArtistForm 
    success_url = '/' 

    def form_valid(self, form): 
     valid = super(CreateArtistView, self).form_valid(form) 
     username, password = form.cleaned_data.get('username'), form.cleaned_data.get('password1') 
     new_user = authenticate(username=username, password=password) 
     login(self.request, new_user) 
     return valid 

ich zum ersten Mal den Wert meiner Eltern Klassenmethode form_valid() in valid fangen, denn wenn Sie es nennen, es ruft die form.save(), die Ihre Benutzer registrieren in Datenbank und füllen Sie Ihre self.object mit dem Benutzer erstellt.

Danach hatte ich ein langes Problem mit meiner Authentifizierung, None zurückgeben. Es ist, weil ich authenticate() mit dem Hash-Kennwort django anruft, und hasse es wieder authentifizieren.

Erklären Sie dies für Sie zu verstehen, warum ich form.cleaned_data.get('username') und nicht self.object.username verwenden.

Ich hoffe es hilft dir oder anderem, da ich keine klare Antwort im Netz gefunden habe.

+0

Ja, das ist genau die gleiche Lösung, die ich gefunden habe. Ich habe auch etwas Zeit verloren, um Hash-Pass zur Authentifizierung zu verwenden)) –