Reputation: 931
So I'm a newbie to django, know python enough not to call myself a beginner but I'm by no means a pro. I'm just trying to get user authentication working on a small django app. I'm using the default authentication system https://docs.djangoproject.com/en/1.8/topics/auth/default/ and the built in forms, the login, logout, etc have their own views but the UserCreationForm doesn't have it's own view, so I figured I had to make my own. Not sure what I'm doing wrong.
this is my views.py
1 from django.shortcuts import render
2 from django.http import HttpResponse
3 from django.contrib.auth.forms import UserCreationForm
4 from django.contrib.auth import login
5
6 def home(request):
7 return HttpResponse("This is a barebones homepage")
8
9 def register(request):
10 registered = False
11
12 if request.method == 'POST':
13 user_form = UserCreationForm(data=request.POST)
14
15 if user_form.is_valid():
16 user = user_form.save()
17 username = user_form.get_username()
18 password = user_form.clean_password2()
19 login(request,user)
20 else:
21 print user_form.errors
22 else:
23 user_form = UserCreationForm()
24
25 return render(request, 'registration/register.html', {'user_form': user_form, 'registered': registered} )
~
this is my register.html
<!DOCTYPE html>
<html>
<head>
<title>Jet!</title>
</head>
<body>
{% if registered %}
Jet! says Thank you for registering!
<a href='/'>Return to the homepage.</a><br />
{% else %}
<form method="post" action="/register/">
{% csrf_token %}
{{ user_form.as_p }}
<input type="submit" name="submit" value="Register" />
</form>
{% endif %}
</body>
</html>
Upvotes: 3
Views: 3120
Reputation: 308799
Firstly, the line username = user_form.get_username()
is giving an error because, as the message says, the form does not have a get_username
method. You can access the username with user_form.cleaned_data['username']
Secondly, the line password = user_form.clean
would give an error, because the form has no attribute clean
. If you needed it, you could get the value from the password1
field with user_form.cleaned_data['password1']
.
Before you login
the user, you must authenticate them, otherwise you will get an error about the user having no attribute backend
.
Putting it together, you have:
if user_form.is_valid():
user_form.save()
username = user_form.cleaned_data['username']
password = user_form.cleaned_data['password1']
user = authenticate(username=username, password=password)
login(request, user)
You'll have to import the authenticate
method by changing your import to:
from django.contrib.auth import authenticate, login
Note that you haven't set registered=True
anywhere in your code. Usually, it is good practice to redirect after the form has been successfully submitted, to prevent duplicate submissions.
Upvotes: 1
Reputation: 162
change user_form.get_username() to request.user.username
username = user_form.get_username() = request.user.username
Upvotes: 0