Folgendes verwende ich derzeit für die Registrierung:
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
new_user = form.save()
messages.info(request, "Thanks for registering. Please login to continue.")
return HttpResponseRedirect("/dashboard/")
else:
form = UserCreationForm()
return render_to_response("accounts/register.html", {
'form': form,
}, context_instance=RequestContext(request))
Ist es möglich, dass sich der Benutzer nach dem Erstellen eines Kontos nicht manuell anmelden muss, sondern sich einfach automatisch anmeldet? Vielen Dank.
edit: Ich hatte die Funktion login () ohne Erfolg ausprobiert. Ich glaube, das Problem ist, dass AUTHENTICATION_BACKENDS nicht gesetzt wurde.
Antworten:
Verwenden der
authenticate()
undlogin()
-Funktionen:from django.contrib.auth import authenticate, login def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): new_user = form.save() messages.info(request, "Thanks for registering. You are now logged in.") new_user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'], ) login(request, new_user) return HttpResponseRedirect("/dashboard/")
quelle
AUTHENTICATION_BACKENDS
aufdjango.contrib.auth.backends.ModelBackend
insettings.py
. Weitere Informationen finden Sie unter docs.djangoproject.com/de/1.2/topics/auth/… .authenticate()
zuerst anrufen, sonst gibt es keinbackend
Set. Ich habe meine Antwort aktualisiert, um dies zu zeigen.authenticate
Ing rohe Saiten verwenden muss . Ich habe versucht, klug zu sein und es vom ursprünglichennew_user
Objekt wegzuschleichen, aber ich stelle mir vor, dass dies einige der Referenzen aus den Feldern mit sich brachte. Das heißt, tu es nicht:new_user = authenticate(username = new_user.username, password = new_user.password)
hol siePOST
dir lieber wie im Snippet beschrieben oder von derform
.new_user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'])
Für klassenbasierte Ansichten war hier der Code, der für mich funktioniert hat (ursprünglich Django 1.7, aktualisiert für 2.1).
from django.contrib.auth import authenticate, login from django.contrib.auth.forms import UserCreationForm from django.http import HttpResponseRedirect from django.views.generic import FormView class SignUp(FormView): template_name = 'signup.html' form_class = UserCreateForm success_url='/account' def form_valid(self, form): #save the new user first form.save() #get the username and password username = self.request.POST['username'] password = self.request.POST['password1'] #authenticate user then login user = authenticate(username=username, password=password) login(self.request, user) return HttpResponseRedirect(self.get_success_url)
quelle
authenticate(username=username, password=password)
wird benötigt? Warum nicht einfach das Benutzerobjekt übergeben?redirect
, siehe meine separate [Frage] ( stackoverflow.com/questions/54179736/… )Sie können die UserCreationForm von Django in Unterklassen unterteilen und die Speichermethode überschreiben, um sie anzumelden, wenn commit = True.
forms.py
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth import login class CustomUserCreationForm(UserCreationForm): """ A ModelForm for creating a User and logging them in after commiting a save of the form. """ def __init__(self, request, *args, **kwargs): super().__init__(*args, **kwargs) self.request = request class Meta(UserCreationForm.Meta): pass def save(self, commit=True): user = super().save(commit=commit) if commit: auth_user = authenticate( username=self.cleaned_data['username'], password=self.cleaned_data['password1'] ) login(self.request, auth_user) return user
Sie müssen nur sicherstellen, dass Sie ein Anforderungsobjekt übergeben, wenn Sie das Formular instanziieren. Sie können dies tun, indem Sie die Methode get_form_kwargs der Ansicht überschreiben.
views.py
def get_form_kwargs(self): form_kwargs = super().get_form_kwargs() form_kwargs['request'] = self.request return form_kwargs
Oder stellen Sie sicher, wenn Sie eine form_class instanziieren
CustomUserCreationForm(data=request.POST, request=self.request)
.quelle