C.Kang
C.Kang

Reputation: 71

MultiValueDictKeyError: "'password'"

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

Answers (1)

Andrea Corbellini
Andrea Corbellini

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

Related Questions