身份验证创建用户但没有电子邮件

时间:2018-07-24 17:15:36

标签: python django

当我使用user = authenticate(username=username, email=email, password=password)时,将创建用户但没有电子邮件。

我有一个旧项目,该代码可以完美运行,但现在在任何项目中均不起作用。

观看次数:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login as django_login
from django.contrib.auth.forms import UserCreationForm
from .models import Profile

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST or None)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            email = form.cleaned_data.get('email')
            password = form.cleaned_data.get('password1')
            user = authenticate(username=username, email=email, password=password)
            django_login(request, user)
            return redirect('profile/')

    form = UserCreationForm()
    context = {'form': form}
    return render(request, 'accounts/signup.html', context)

模板:

{% block content %}
<main>
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <p>Username:</p>
    <input type="text" name="username">
    <p>Email:</p>
    <input type="text" name="email">
    <p>Password:</p>
    <input type="password" name="password1">
    <p>Repeat password:</p>
    <input type="password" name="password2">
    <p><input type="submit" value="submit"></p>
  </form>
</main>
{% endblock %}

2 个答案:

答案 0 :(得分:0)

from django.contrib.auth.models import User

user = User.objects.create_user(username=username, email=email, password=password)

电子邮件未包含在UserCreatedForm中。 link

答案 1 :(得分:0)

因此,就像薄荷所说的UserCreationForm不包含电子邮件。为什么这么重要?不会抛出任何错误。

UserCreationForm.save()未保存email字段,因为它不知道该字段。您需要做的是子类UserCreationForm来包含email字段,然后将该字段也包含在覆盖的save()调用中。这是您可能要采取的方法:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class UserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

对此问题归功于我将OP的表单子类从How do I extend UserCreationForm to include email field

中提取出来。