Итак, я раньше использовал django-allauth, и он отлично подходит для регистрации пользователей и функций входа в систему.
В настоящее время я работаю над небольшим приложением, для которого требуется своего рода «Отъезд гостя», сотрудник должен иметь возможность создать пользователя без необходимости регистрации (создание пароля или возможность входа)
Я мог бы создать отдельную модель для учетных записей гостей, используя ту же информацию, которая использовалась в пользовательской модели, это было бы самое простое решение, но нарушающее сухой принцип.
Поскольку я наследую от "AbstractBaseUser", чтобы создать учетную запись пользователя с полем электронной почты в качестве уникального идентификатора, я подумал, что мы можем разделить модель на модель "CustomAccount", требуя адрес электронной почты и настройку отдельной модели для хранения всего пользователя. информация и установите guest_flag.
Теперь мы можем создать заказ с помощью guest_user, но затем мы не сможем зарегистрировать адрес электронной почты гостей или преобразовать их в зарегистрированного пользователя позже.
С другой стороны, мы не можем дважды создать «гостевой заказ», так как мы используем адрес электронной почты в качестве идентификатора unqiue, или мы не должны регистрировать адрес электронной почты для гостевых заказов, но тогда мы не можем информировать их об обновлениях заказов. .
У кого-нибудь есть указания, предложения по использованию как гостевых учетных записей, так и зарегистрированных пользователей?
Ниже приведен код, который я пытался использовать для разделения модели пользователя на учетную запись и модель пользователя.
models.py
'''
Functionality
#1;
- A user can signup using their emailaddress and password to create an account.
- Before a user can create an order, their emailaddress needs to be verified.
- Once the emailaddress has been verified, the user can create an order himself (or herself).
#2;
- A user flagged as "is_employee" can create an guest user without the need for an emailaddress or password.
- An employee can than use the newly created guest user to create an order.
'''
# "CustomAccount" model, overriding the default "User" model
class CustomAccount(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True, null=True)
is_staff = models.BooleanField(
_('staff status'),
default=False,
help_text=_('Designates whether the user can log into this 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)
USERNAME_FIELD = 'email'
objects = CustomAccountManager()
def __str__(self):
return self.email
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
# OneToOne model adding personal information to the account
class CustomUser(models.Model):
first_name = models.CharField(_('first name'), max_length=30, blank=True)
last_name = models.CharField(_('last name'), max_length=150, blank=True)
street = models.CharField(max_length=200, blank=True)
street_number = models.CharField(max_length=4, blank=True, null=True)
postcode = models.CharField(max_length=7, blank=True, null=True)
city = models.CharField(max_length=200, blank=True)
remark = models.TextField(max_length=1000, blank=True)
# Set primary_ket to True
user = models.OneToOneField('CustomAccount', on_delete=models.CASCADE, primary_key=True, blank=True, null=True)
# Flags
is_guest = models.BooleanField(default=False)
is_employee = models.BooleanField(default=False)
# When a new user is created from the admin area and CustomUser data has not been updated, link CustomUser to emailaddress
def __str__(self):
return (self.last_name, self.first_name)
# When an account is created, create new record for CustomUser as well.
@receiver(post_save, sender=CustomAccount)
def create_custom_user(sender, instance, created, **kwargs):
if created
CustomUser.objects.create(user=instance)
@receiver(post_save, sender=CustomAccount)
def save_custom_user(sender, instance, **kwargs):
instance.customuser.save()
managers.py
class CustomAccountManager(BaseUserManager):
"""
A custom user manager to deal with emails as unique identifiers for auth
instead of usernames. The default that's used is "UserManager"
"""
def _create_user(self, email, password, **extra_fields):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('The Email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)