Как изменить поле электронной почты в модели AbstractUser так, чтобы электронная почта была обязательной - PullRequest
1 голос
/ 05 июня 2019

Как установить поле электронной почты на обязательное при расширении AbstractUser?

Мне было интересно, как переопределить модель поля электронной почты AbstractUser, чтобы установить ее как требуется.В настоящее время в моей форме указано поле электронной почты, но оно не является обязательным.По умолчанию не все модели должны быть обязательными?

Из документации приведен пример того, как установить поле в обязательное поле при создании суперпользователя, но я не уверен, как выполнить задачу из модели AbstractUser без использования AbstractBaseUser.


model.py

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

class CustomUser(AbstractUser):
    display_name = models.CharField(max_length=50, unique=True)
    bio = models.CharField(max_length=500, blank=True, null=True)
    authorization_code = models.CharField(max_length=20)


forms.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', 'display_name', 'authorization_code')

class CustomUserChangeForm(UserChangeForm):

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


admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['email', 'username', 'display_name', 'bio']
    list_display_links = ('username', 'display_name')

    fieldsets = (
        (None, {'fields': ('username', 'display_name', 'email', 'bio', 'password')}),
        ('Permissions', {'fields': ('is_staff', 'is_active')}),
    )

    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'display_name', 'email', 'bio', 'password1', 'password2', 'is_staff', 'is_active')}
         ),
    )



admin.site.register(CustomUser, CustomUserAdmin)

Решение:


# It was as simple as updating my CustomUser model as shown:

class CustomUser(AbstractUser):
    display_name = models.CharField(max_length=50, unique=True)
    bio = models.CharField(max_length=500, blank=True, null=True)
    authorization_code = models.CharField(max_length=20)
    email = models.EmailField(max_length=50, unique=True)

1 Ответ

0 голосов
/ 05 июня 2019

Вы можете сделать это, переопределив email в AbstractBaseUser .

from django.contrib.auth.models import AbstractBaseUser, UserManager

class User(AbstractBaseUser):
    email = models.EmailField(_('email address'), blank=False)       
    objects = UserManager()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...