如何将登录表单自定义为用户的电子邮件而不是用户的用户名

Shi*_*iko 1 python django

我正在遵循 Django 登录教程,完成后我发现登录表单需要用户名和密码,但我想用用户的电子邮件替换用户名。

这是views.py

@login_required
def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created! You are now able to log in')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})
 
 
@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST,
                                   request.FILES,
                                   instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')
 
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)
 
    context = {
        'u_form': u_form,
        'p_form': p_form
    }
 
    return render(request, 'users/profile.html', context)
Run Code Online (Sandbox Code Playgroud)

这是 forms.py

 
class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
 
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']
 
 
class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()
 
    class Meta:
        model = User
        fields = ['username', 'email']
 
 
class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']
Run Code Online (Sandbox Code Playgroud)

这是模板

<form class="login100-form validate-form" method="POST">
<span class="login100-form-title p-b-34">
 Account Login
  </span>
 <fieldset class="input100 m-b-20">
  {% csrf_token %}
  {{ form|crispy }}
     </fieldset>
  <div class="container-login100-form-btn">
  <button class="login100-form-btn" type="submit" style="width: 90%">
       Sign in
   </button>
 </div>
 <div class="w-full text-center p-t-27 p-b-100">
  <a class="txt2" href="{% url 'password_reset' %}">Forgot Password ?</a>
   </div>
  </form>
Run Code Online (Sandbox Code Playgroud)

我的问题如何从用户名更改为用户的电子邮件?

Lor*_*hiV 5

要使用电子邮件创建 Django 登录,我们必须覆盖默认用户,我们可以开始编写模型,但首先您可能想为您的用户创建不同的应用程序(这是一个很好的做法)。

模型.py

class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False) # a admin user; non super-user
    admin = models.BooleanField(default=False) # a superuser
    # notice the absence of a "Password field", that is built in.

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [] # Email & Password are required by default.

    def get_full_name(self):
        # The user is identified by their email address
        return self.email
Run Code Online (Sandbox Code Playgroud)

Django 有用于用户管理器的内置方法。我们必须自定义它们才能使我们的自定义用户模型正常工作。

class UserManager(BaseUserManager):
    def create_user(self, email, password=None):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user
Run Code Online (Sandbox Code Playgroud)

然后您需要运行迁移。

python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

您可以关注以下帖子:这里