是否可以覆盖用户模型以使电子邮件字段成为必填字段?
Can the User model be overridden to make the email field required?
对于我的应用程序,Django User model
中的电子邮件字段应该是必需的,但默认情况下它是可选的。
我搜索了这个问题,但我找到的大多数答案都是关于在自定义 UserCreationForm
for example:
中设置必填电子邮件字段
class CustomUserForm(UserCreationForm):
"""Provide a view for creating users with only the requisite fields."""
class Meta:
model = User
# Note that password is taken care of for us by auth's UserCreationForm.
fields = ('username', 'email')
def __init__(self, *args, **kwargs):
super(CustomUserForm, self).__init__(*args, **kwargs)
self.fields['email'].required = True
但我也想在 User
模型中强制使用电子邮件 因为我在想 ModelForm
可能是前端的东西并且是必需的条件可能被用户使用 chrome 开发工具关闭,我错了吗? ModelForm
中要求的电子邮件是否与用户 model
中要求的电子邮件相同, 或者我可以重写用户模型以使电子邮件成为必需的吗?
from django.contrib.auth.models import User
from django.db import models
User.add_to_class('email', models.EmailField(blank=False))
Maybe ModelForm are a frontend thing and the required condition maybe be turned off by the user by using the chrome dev tools, am I wrong?
你是正确的,用户可以使用工具来制作不需要的输入项,事实上你经常可以改变 DOM 从而改变 HTML 形式,或者更简单地制作使用 curl
之类的工具发出 POST 请求,您可以在其中 post 任意数据。
但是 Form
(在一定程度上是 ModelForm
) 而不是 只呈现 HTML 中的表单,它也被使用验证 数据。因此,这意味着如果您使用具有以下内容的视图:
def my_view(request):
if request.method == 'POST':
form = CustomUserForm(request.POST, request.FILES)
if <b>form.is_valid()</b>:
# …
# …
# …
然后 form.is_valid()
将 return False
如果用户没有填写电子邮件地址。因此,表单用于验证、清理数据、在模型中存储数据以及呈现 HTML 表单。
在您的设置文件中
AUTH_USER_MODEL = 'yourapp.User'
在你的模型中
from django.db import models
from django.contrib.auth.models import AbstractUser, Permission, Group
from django.utils.translation import gettext_lazy as _
class User(AbstractUser):
groups = models.ManyToManyField(
Group,
verbose_name=_('groups'),
blank=True,
help_text=_(
'The groups this user belongs to. A user will get all permissions '
'granted to each of their groups.'
),
related_name="user_groups",
related_query_name="user",
)
user_permissions = models.ManyToManyField(
Permission,
verbose_name=_('user permissions'),
blank=True,
help_text=_('Specific permissions for this user.'),
related_name="user_permissions",
related_query_name="user",
)
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['email']
# here you can add new fields and attributes
class Meta:
permissions = (
# here you can add pressiion
)
在您的管理员中
from custodia.models import User
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _
@admin.register(User)
class UserAdmin(UserAdmin):
list_display = ('email', 'first_name', 'last_name', 'customer', 'is_staff', 'is_active')
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Aditional info'), {'fields': ('your_new_fields',)}),
(_('Permissions'), {
'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups', 'customer')
对于我的应用程序,Django User model
中的电子邮件字段应该是必需的,但默认情况下它是可选的。
我搜索了这个问题,但我找到的大多数答案都是关于在自定义 UserCreationForm
for example:
class CustomUserForm(UserCreationForm):
"""Provide a view for creating users with only the requisite fields."""
class Meta:
model = User
# Note that password is taken care of for us by auth's UserCreationForm.
fields = ('username', 'email')
def __init__(self, *args, **kwargs):
super(CustomUserForm, self).__init__(*args, **kwargs)
self.fields['email'].required = True
但我也想在 User
模型中强制使用电子邮件 因为我在想 ModelForm
可能是前端的东西并且是必需的条件可能被用户使用 chrome 开发工具关闭,我错了吗? ModelForm
中要求的电子邮件是否与用户 model
中要求的电子邮件相同, 或者我可以重写用户模型以使电子邮件成为必需的吗?
from django.contrib.auth.models import User
from django.db import models
User.add_to_class('email', models.EmailField(blank=False))
Maybe ModelForm are a frontend thing and the required condition maybe be turned off by the user by using the chrome dev tools, am I wrong?
你是正确的,用户可以使用工具来制作不需要的输入项,事实上你经常可以改变 DOM 从而改变 HTML 形式,或者更简单地制作使用 curl
之类的工具发出 POST 请求,您可以在其中 post 任意数据。
但是 Form
(在一定程度上是 ModelForm
) 而不是 只呈现 HTML 中的表单,它也被使用验证 数据。因此,这意味着如果您使用具有以下内容的视图:
def my_view(request):
if request.method == 'POST':
form = CustomUserForm(request.POST, request.FILES)
if <b>form.is_valid()</b>:
# …
# …
# …
然后 form.is_valid()
将 return False
如果用户没有填写电子邮件地址。因此,表单用于验证、清理数据、在模型中存储数据以及呈现 HTML 表单。
在您的设置文件中
AUTH_USER_MODEL = 'yourapp.User'
在你的模型中
from django.db import models
from django.contrib.auth.models import AbstractUser, Permission, Group
from django.utils.translation import gettext_lazy as _
class User(AbstractUser):
groups = models.ManyToManyField(
Group,
verbose_name=_('groups'),
blank=True,
help_text=_(
'The groups this user belongs to. A user will get all permissions '
'granted to each of their groups.'
),
related_name="user_groups",
related_query_name="user",
)
user_permissions = models.ManyToManyField(
Permission,
verbose_name=_('user permissions'),
blank=True,
help_text=_('Specific permissions for this user.'),
related_name="user_permissions",
related_query_name="user",
)
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['email']
# here you can add new fields and attributes
class Meta:
permissions = (
# here you can add pressiion
)
在您的管理员中
from custodia.models import User
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _
@admin.register(User)
class UserAdmin(UserAdmin):
list_display = ('email', 'first_name', 'last_name', 'customer', 'is_staff', 'is_active')
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Aditional info'), {'fields': ('your_new_fields',)}),
(_('Permissions'), {
'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups', 'customer')