Django Пользовательская модель пользователя добавить свойство - PullRequest
1 голос
/ 05 мая 2020

Моя модель относительно проста, но я хочу, чтобы пользователи были членами клуба. Суперпользователи не являются членами клуба.

Я решил использовать настраиваемую модель пользователя, расширяющую AbstractBaseUser , и создал модели, менеджеров, и все работает нормально. Теперь я хочу расширить модель с помощью свойства.

models.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)

manager.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)

1 Ответ

2 голосов
/ 05 мая 2020

Лучший способ реализовать это:

  1. Прежде всего, вам нужно создать одну модель между Club и User (вместо создания поля M2M) . Я назвал его Enrollment.
  2. Поместите Club и User внешний ключ этой модели.

Итак:

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)

Если следуя этому пути, в будущем вы сможете делать все, что захотите.

Надеюсь, это поможет.

...