注册后自动登录

2024-04-26 12:13:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在django1.9中,如何在用户注册后自动登录?你知道吗

我遵循this question的答案,但在尝试时得到了this error。你知道吗

我将AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)添加到设置.py你知道吗

这是我的视图.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})

还有我的表单.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(),
        }

Tags: djangofromimportselfformfieldrequestforms
1条回答
网友
1楼 · 发布于 2024-04-26 12:13:12

您正在为表单使用前缀,因此数据将作为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'],
                        )

相关问题 更多 >