python - 如何通过编写新的 admin.ModelAdmin 在 Wagtail 1.8 中创建自定义用户模型?
问题描述
在 Wagtail 1.8 项目中,我正在尝试创建一个自定义用户模型,它不使用用户名,而只使用电子邮件。我希望能够定义额外的变量,例如is_training
并将其显示在管理区域下的编辑表单中admin/users/edit
。
现在我已经有了 EmailUser (CustomUser),但我无法将布尔值或复选框添加到管理员编辑面板。
class AbstractEmailUser(AbstractBaseUser, PermissionsMixin):
"""Abstract User with the same behaviour as Django's default User.
AbstractEmailUser does not have username field. Uses email as the
USERNAME_FIELD for authentication.
Inherits from both the AbstractBaseUser and PermissionMixin.
The following attributes are inherited from the superclasses:
* password
* last_login
* is_superuser
"""
email = models.EmailField(
verbose_name=_('email address'),
max_length=255,
unique=True,
db_index=True,
error_messages={
'unique': _("A user with that e-mail already exists."),
}
)
email_new = models.EmailField(
verbose_name=_('new email address'),
max_length=255,
unique=True,
error_messages={
'unique': _("A user with that e-mail already exists."),
},
null=True, blank=True
)
first_name = models.CharField(
max_length=150,
verbose_name=_('first name'),
blank=True,
)
last_name = models.CharField(
max_length=150,
verbose_name=_('last name'),
blank=True
)
is_staff = models.BooleanField(
_('staff status'),
default=False,
help_text=_('Designates whether the user can log into this admin site.'),
)
is_active = models.BooleanField(
verbose_name=_('active'),
default=True,
help_text=_(
'Designates whether this user should be treated as active. '
'Unselect this instead of deleting accounts.'
),
)
is_training = models.BooleanField(
verbose_name=_('training'),
default=False,
help_text=_(
'Designates whether this user participates in training and therefore has special access to the'
'training site. '
),
)
date_joined = models.DateTimeField(
verbose_name=_('date joined'),
default=timezone.now
)
last_downloads_check = models.DateTimeField(
verbose_name=_('Last downloads check'),
help_text=_('The last time the user checked the latest downloads.'),
default=timezone.now
)
last_news_check = models.DateTimeField(
verbose_name=_('Last news check'),
help_text=_('The last time the user checked the latest news in the consultants only area.'),
default=timezone.now
)
objects = EmailUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
abstract = True
def get_full_name(self):
"""Return first_name plus last_name, with a space in between."""
return "{} {}".format(self.first_name, self.last_name).strip()
def get_short_name(self):
"""Returns the short name for the user."""
return self.first_name
def get_identifier(self):
if self.first_name and self.last_name:
return self.get_full_name()
else:
return self.email
def email_user(self, subject, message, from_email=None, **kwargs):
"""Send an email to this User."""
send_mail(subject, message, from_email, [self.email], **kwargs)
def __unicode__(self):
return 'email="{}" firstName="{}" lastName="{}" admin={}'.format(
self.email, self.first_name, self.last_name, self.is_staff, self.is_training
)
据我了解,我需要编写一个新的 ModelAdmin,因为我的 EmailUser 没有用户名:
from __future__ import unicode_literals
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .models import EmailUser
class EmailUserAdmin(admin.ModelAdmin):
list_display = ('email', 'first_name', 'last_name', 'is_training')
list_filter = ('is_staff', 'is_superuser')
admin.site.register(User, EmailUserAdmin)
在编写 ModelAdmin 时,我陷入了困境。我不知道如何连接到 wagtails 管理表单并使其与我的模型一起使用。
任何帮助将不胜感激。
解决方案
您还需要向 Wagtail 的 ModelAdmin 注册它,通常在wagtail_hooks.py
文件中完成。这是一个示例,其中包含您可能想要调整的其他几个选项:
from wagtail.contrib.modeladmin.options import (
ModelAdmin, modeladmin_register
)
from .models import EmailUser
class UserAdmin(ModelAdmin):
model = EmailUser
menu_label = 'Users'
menu_icon = 'fa-folder-open'
add_to_settings_menu = True
list_display = ('email', 'first_name', 'last_name', 'is_training')
list_filter = ('is_staff', 'is_superuser')
ordering = ('email',)
modeladmin_register(UserAdmin)
请参阅此处的文档:http: //docs.wagtail.io/en/v2.4/reference/contrib/modeladmin/#how-to-use
祝你好运!
推荐阅读
- php - 在 PHP 中的 multispan XML 中维护换行符或不换行符
- wordpress - 在选择框中显示所有分类术语 - ACF Wordpress
- javascript - 如何使用 Mongo Shell 运行裸 JavaScript 文件?
- kubernetes - 我无法 curl 部署在 k8s 集群上的 nginx
- google-apps-script - Google Apps Script Sheets 功能停止工作,不再工作
- azure - 应用服务未返回具有自定义 TLS 绑定的完整证书链
- c# - C#按字符串过滤对象列表
- reactjs - 在 Next.js 中存储管理 API 令牌的最佳方式是什么?感觉就像在客户端存储它,因为只有 http 的 cookie 是有风险的
- android - Android 应用程序链接不起作用且未出现在 adb dumpsys 中
- java - 在 feign 客户端拦截器中获取请求 url