如何从 django userchangeform 的登录页面中删除用户名字段

Muh*_*ain 3 python django-rest-framework django-rest-auth

登录页面中有三个字段(用户名、电子邮件、密码),但我只想要两个字段(电子邮件、密码)。如何从登录页面中删除用户名字段。提前致谢

模型.py

from django.db import models
from django.contrib.auth.models import AbstractUser


class CustomUser(AbstractUser):
    name = models.CharField(max_length=255)

    def __str__(self):
    return self.email
Run Code Online (Sandbox Code Playgroud)

表格.py

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('username','email')

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = UserChangeForm.Meta.fields
Run Code Online (Sandbox Code Playgroud)

序列化程序.py

from rest_framework import serializers
from . import models

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.CustomUser
        fields = ('email', 'username', )
Run Code Online (Sandbox Code Playgroud)

yof*_*fee 6

username从登录端点删除字段

您可以username通过覆盖LoginSerializer这样的内容来删除该字段:

from rest_auth.serializers import LoginSerializer as RestAuthLoginSerializer


class LoginSerializer(RestAuthLoginSerializer):
    username = None
Run Code Online (Sandbox Code Playgroud)

然后在你的添加以下内容settings.py

REST_AUTH_SERIALIZERS = {'LOGIN_SERIALIZER': 'path.to.your.LoginSerializer'}

ACCOUNT_AUTHENTICATION_METHOD = 'email'

ACCOUNT_EMAIL_REQUIRED = True
Run Code Online (Sandbox Code Playgroud)

添加端点以更改电子邮件和密码

事实证明,这实际上不是 OP 的问题,但为了完整起见,我将其留在这里。

您可以添加一个端点来更改用户设置,如下所示:

from rest_framework import serializers, generics
from . import models


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.CustomUser
        fields = ('email', 'password')


class UserChangeView(generics.UpdateAPIView):
    queryset = models.CustomUser.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您不需要 API 的表单。