注册后自动登录

时间:2016-02-11 14:54:47

标签: python django

在django 1.9中,如何在用户注册后自动登录?

我按照this question的回答,但在尝试时我得到this error

我将AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)添加到settings.py

这是我的views.py:

from django.shortcuts import render
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from .models import UserProfile
from django.contrib.auth.models import User
from .forms import UserForm
from .forms import UserProfileForm
from django.http import HttpResponseRedirect
from django.contrib.auth import authenticate, logout, login

# Create your views here.
def RegisterView(request):

    registration_success = False

    if request.method == 'POST':
        user_form = UserForm(request.POST, prefix='uf')
        profile_form = UserProfileForm(request.POST, request.FILES, prefix='upf')

        if user_form.is_valid() and profile_form.is_valid():
            user_atr = user_form.save()
            user_atr.set_password(user_atr.password)
            user_atr.save()

            profile = profile_form.save(commit=False)
            profile.user = user_atr

            profile.avatar = request.FILES.get('avatar')

            profile.save()
            registration_success = True
            user_atr = authenticate(username=request.POST['username'],
                                    password=request.POST['password'])
            login(request, user_atr)
            return HttpResponseRedirect("/")
        else:
            print (user_form.errors, profile_form.errors)

    else:
        user_form = UserForm(prefix='uf')
        profile_form = UserProfileForm(prefix='upf')

    return render(request, 'profile/register.html', {'profile_form': profile_form, 'user_form': user_form})

我的forms.py:

class UserForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, **kwargs)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'field-input-element'

    confirm_password = forms.CharField(widget=forms.PasswordInput())

    class Meta:
        model = User
        fields = ('username', 'email', 'password')
        widgets = {
            'password': forms.PasswordInput(),
        }


class  UserProfileForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'field-input-element'

    class Meta:
        model = UserProfile
        fields = ('display_name', 'avatar', 'birthday', 'usertype', 'daw', 'usergenre', 'gender')
        widgets = {
            'birthday': AdminDateWidget(),
        }

1 个答案:

答案 0 :(得分:2)

您正在为表单使用前缀,因此数据将发布为uf-usernameuf-password。因此,request.POST['username']会提供KeyError

无论如何直接从request.POST获取数据通常不是一个好主意。从表单的清理数据中获取它,让Django处理前缀和验证。

user_atr = authenticate(username=user_form.cleaned_data['username'],
                        password=user_form.cleaned_data['password'],
                        )
相关问题