Django自定义用户模型添加属性

2024-09-28 20:54:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我的模型相对简单,但我希望用户成为俱乐部的成员。超级用户不是俱乐部的成员

我决定use a Custom User Model Extending AbstractBaseUser并创建了模型、管理器,一切都很好。现在我想通过一个属性来扩展模型

型号。py:

from .managers import MyUserManager

class K2User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
    is_active = models.BooleanField(_('active'), default=True)
    is_staff = models.BooleanField(_('active'), default=True)
 #   club_name = models.ForeignKey(Clubs, null=True, 

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def get_club_name(self):
        return self.club_name

    def __str__(self):
        return self.email

class Clubs(models.Model):
    club_name = models.CharField(max_length=32, unique=True)
    club_create_date = models.DateTimeField('date created')
    club_address = models.CharField(max_length=200)
    email = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, verbose_name=_('user'), on_delete=models.CASCADE)

managers.py

from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _

class MyUserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):

        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
       # club_name = club_name
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_superuser', False)
        extra_fields.setdefault('is_staff', False)

        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_staff', True)

        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        return self._create_user(email, password, **extra_fields)

如何将俱乐部名称添加到普通用户,以便他必须是俱乐部的成员,但超级用户没有此属性(或只是将其设置为null)

**编辑**

在我的管理员视图中,我仍然只看到每个俱乐部的一名成员-我想我必须修改admin.py来实现这一点

admin.py:

class K2UserAdmin(UserAdmin):
    add_form = K2UserCreationForm
    form = K2UserChangeForm
    model = K2User
    list_display = ('email', 'date_joined', 'is_active',)# 'merchant',)
    list_filter = ('email', 'date_joined', 'is_active',)# 'merchant',)
    fieldsets = ( (None,            { 'fields': ('email', 'password') } ),
                  ('Permissions',   { 'fields': ('date_joined', 'is_active') } ), )
    add_fieldsets = ( (None,    {'classes': ('wide',),
                       'fields': ('email', 'password1', 'password2', 'date_joined', 'is_active') } ), )
    readonly_fields = ('date_joined',)    

admin.site.register(K2User, K2UserAdmin)
admin.site.register(Clubs)

Tags: nameselftruefieldsdateismodelsemail
1条回答
网友
1楼 · 发布于 2024-09-28 20:54:52

实现这一点的最佳方法如下:‌

  1. 首先,您需要在ClubUser之间创建一个模型 (而不是创建M2M字段)。我把它命名为Enrollment
  2. ClubUser外键放入此模型

因此:

class Enrollment(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name=_('enrollment_users'), on_delete=models.CASCADE)
   club = models.ForeignKey(Club, related_name=_('enrollment_clubs'), on_delete=models.CASCADE)

如果你这样做,你将来可以在这段关系中做任何你想做的事。

希望能有所帮助。

相关问题 更多 >