Model saya relatif sederhana, tetapi saya ingin pengguna menjadi anggota klub. Pengguna super bukan anggota klub.

Saya memutuskan untuk menggunakan Custom Model Pengguna Memperluas AbstractBaseUser dan membuat model, pengelola, dan semuanya berfungsi dengan baik. Sekarang saya ingin memperluas model dengan properti.

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)

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)

Bagaimana saya bisa menambahkan nama klub ke pengguna biasa, sehingga dia harus menjadi anggota klub, tetapi pengguna super tidak memiliki properti ini (atau hanya mengaturnya nol)?

** Sunting **

Dalam tampilan admin saya, saya masih hanya melihat satu anggota untuk setiap klub - saya kira saya harus bermain-main dengan admin.py untuk itu?

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
xtlc 5 Mei 2020, 10:59

1 menjawab

Jawaban Terbaik

Cara terbaik untuk menerapkan ini adalah sebagai berikut:‌

  1. Pertama-tama, Anda perlu membuat satu model antara Club dan User (daripada membuat bidang M2M). Saya menamakannya Enrollment.
  2. Masukkan Club dan User kunci asing model ini.

Begitu:

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)

Jika Anda mengikuti cara ini, Anda dapat melakukan apa pun yang Anda inginkan dalam hubungan ini di masa mendatang.

Semoga membantu.

1
Whale 52Hz 5 Mei 2020, 11:14