Я объединяю django -инвитации с django -соглашением для приглашения и регистрации пользователя.
Я бы хотел, чтобы администратор (при создании приглашения через Django Администратор) предоставил дополнительные данные (здесь внешний ключ к объекту Patient). Это архивируется путем добавления дополнительного поля к (пользовательской) модели приглашения:
class PatientInvitation (AbstractBaseInvitation):
email = models.EmailField(unique=True, verbose_name=_('e-mail address'),
max_length=app_settings.EMAIL_MAX_LENGTH)
created = models.DateTimeField(verbose_name=_('created'),
default=timezone.now)
patient = models.ForeignKey(Patient, blank=True, null=True, on_delete=models.CASCADE)
@classmethod
def create(cls, email, inviter=None, patient=None, **kwargs):
key = get_random_string(64).lower()
instance = cls._default_manager.create(
email=email,
key=key,
inviter=inviter,
patient=patient,
**kwargs)
return instance
def key_expired(self):
expiration_date = (
self.sent + datetime.timedelta(
days=app_settings.INVITATION_EXPIRY))
return expiration_date <= timezone.now()
def send_invitation(self, request, **kwargs):
current_site = kwargs.pop('site', Site.objects.get_current())
invite_url = reverse('invitations:accept-invite',
args=[self.key])
invite_url = request.build_absolute_uri(invite_url)
ctx = kwargs
ctx.update({
'invite_url': invite_url,
'site_name': current_site.name,
'email': self.email,
'key': self.key,
'inviter': self.inviter,
})
Когда приглашенный пользователь регистрируется, я бы хотел, чтобы эти данные оказались в пользовательской модели пользователя:
class customUser(AbstractUser):
username_validator = MyValidator()
is_patient = models.BooleanField(default=False)
patient = models.ForeignKey(Patient, null=True, blank=True, on_delete=models.CASCADE)
username = models.CharField(
_('username'),
max_length=150,
unique=True,
)
Я изучил сигналы для передачи данных, но не смог найти, как именно это сделать. Другой вариант, кажется, добавляет PK внешнего ключа в скрытое поле в форме регистрации (хотя это кажется небезопасным).
Я немного застрял на этом, так что если кто-то может указать мне в правильное направление, было бы очень признательно:)
С уважением, Joris