Reputation: 71
My url is shown below like:
url(r'^register/$', views.register, name='register')
The function in my views.py is like:
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.forms import UserCreationForm
def register(request):
"""register"""
if request.method != 'POST':
#we present a blank form
form = UserCreationForm()
else:
#the post the data the users have just filled
form = UserCreationForm(data=request.POST)
if form.is_valid():
new_user = form.save()
# we use the date to redirect our user to the page of login
authenticated_user = authenticate(username=new_user.username,
password=request.POST['password'])
login(request, authenticated_user)
return HttpResponseRedirect(reverse('learning_logs:index'))
context = {'form': form}
return render(request, 'users/register.html', context)
And my register.html:
{% extends "learning_logs/base.html" %}
{% block content %}
<form action="{% url 'users:register' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button name="submmit">Register</button>
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}"/>
</form>
{% endblock content %}
when I do the register, it goes wrong like, MultiValueDictKeyError: "'password'"
Can some one have a look and give me a hand? Thanks a lot!
Upvotes: 1
Views: 1785
Reputation: 17751
If you check UserCreationForm
, you'll see that it doesn't have a field named password
, but it has two: password1
and password2
. You can change your code to this:
if form.is_valid():
new_user = form.save()
# we use the date to redirect our user to the page of login
authenticated_user = authenticate(username=new_user.username,
password=form.cleaned_data['password1'])
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
login(request, authenticated_user)
return HttpResponseRedirect(reverse('learning_logs:index'))
However, you probably want to avoid dealing with passwords and simply use login()
directly, without passing through authenticate()
:
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse('learning_logs:index'))
Upvotes: 2