2019-01-31, 如何增加 Django 用戶的欄位
【摘要】 Django 的強項之一,就是有立即可用的 user/group,同時可以設定後台的權限,以及在 view 裡應用來客製不同的權限。如果在需要交付的項目裡,想要自行再做個 user/group 那是很不明智的。如何在現有的有限欄位裡,venv/lib/python3.6/site-packages/django/contrib/auth/models.pyclass AbstractUs...
Django 的強項之一,就是有立即可用的 user/group,同時可以設定後台的權限,以及在 view 裡應用來客製不同的權限。
如果在需要交付的項目裡,想要自行再做個 user/group 那是很不明智的。
如何在現有的有限欄位裡,
venv/lib/python3.6/site-packages/django/contrib/auth/models.py
class AbstractUser(AbstractBaseUser, PermissionsMixin): """ An abstract base class implementing a fully featured User model with admin-compliant permissions. Username and password are required. Other fields are optional. """ username_validator = UnicodeUsernameValidator() username = models.CharField( _('username'), max_length=150, unique=True, help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), validators=[username_validator], error_messages={ 'unique': _("A user with that username already exists."), }, ) first_name = models.CharField(_('first name'), max_length=30, blank=True) last_name = models.CharField(_('last name'), max_length=150, blank=True) email = models.EmailField(_('email address'), 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( _('active'), default=True, help_text=_( 'Designates whether this user should be treated as active. ' 'Unselect this instead of deleting accounts.' ), ) date_joined = models.DateTimeField(_('date joined'), default=timezone.now) objects = UserManager() EMAIL_FIELD = 'email' USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['email'] class Meta: verbose_name = _('user') verbose_name_plural = _('users') abstract = True def clean(self): super().clean() self.email = self.__class__.objects.normalize_email(self.email) def get_full_name(self): """ Return the first_name plus the last_name, with a space in between. """ full_name = '%s %s' % (self.first_name, self.last_name) return full_name.strip() def get_short_name(self): """Return the short name for the user.""" return self.first_name 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) class User(AbstractUser): """ Users within the Django authentication system are represented by this model. Username and password are required. Other fields are optional. """ class Meta(AbstractUser.Meta): swappable = 'AUTH_USER_MODEL'
再填加欄位?
官網,https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#extending-user
做了些說明。
也做了些擴展演示。
我要的其實是官網再加上這個,https://stackoverflow.com/questions/163823/can-list-display-in-a-django-modeladmin-display-attributes-of-foreignkey-field
由於官網教了如何在 admin.py 調整
於是可以達到這個效果,
在這裡,把 admin.py 的代碼附上
from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import User from .models import Employee admin.site.register(Employee) class EmployeeInline(admin.StackedInline): model = Employee can_delete = False verbose_name_plural = 'employee' class UserAdmin(BaseUserAdmin): inlines = (EmployeeInline,) list_display = ('username','first_name','last_name','is_staff','get_dept') # https://stackoverflow.com/questions/163823/can-list-display-in-a-django-modeladmin-display-attributes-of-foreignkey-field def get_dept(self, obj): return obj.employee.department get_dept.short_description = 'Department' # Re-register UserAdmin admin.site.unregister(User) admin.site.register(User, UserAdmin)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)