Django -invitations, Django -Allauth: передать данные поля модели из пользовательского приглашения (пользовательскому) объекту пользователя - PullRequest
0 голосов
/ 02 марта 2020

Я объединяю 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...