【问题标题】:django allauth user_signed_up signal isn't workingdjango allauth user_signed_up 信号不起作用
【发布时间】:2018-12-29 11:48:53
【问题描述】:
from django.db import models
import time
from django.contrib.auth.models import User
from allauth.account.signals import user_signed_up, password_set
from django.db.models.signals import post_save
from django.dispatch import receiver, Signal

@receiver(user_signed_up)
def employeeID(sender, **kwargs):
    # username = kwargs['request'].user.username
    username = kwargs['user'].username
    u = User.objects.get(username = username)
    u.username = str(time.time()).split('.')[0]
    u.save()

# Create your models here.
# @receiver(user_signed_up)
# def employeeID(sender=User, **kwargs):
#     old_username = kwargs['username']
#     user = User.objects.get(username = old_username)
#     user.username = str(time.time()).split('.')[0]
#     user.save()

# @receiver(user_signed_up)
# # def employeeID(request, user, sociallogin=None, **kwargs):
# def employeeID(sender, **kwargs):
#     print('signal received')
#     old_username = kwargs.username
#     user = User.objects.get(username = old_username)
#     user.username = str(time.time()).split('.')[0]
#     user.save()

# @receiver(user_signed_up)
# def employeeID(sender, **kwargs):
#     request = kwargs['request']
#     user = kwargs['user']
#     # Do your stuff with the user
#     username = request.user.username
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

# @receiver(user_signed_up)
# def employeeID(sender=User, **kwargs):
#     request = kwargs['request']
#     user = kwargs['user']
#     # Do your stuff with the user
#     username = request.user.username
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

# @receiver(user_signed_up, sender=User)
# def employeeID(sender=User, **kwargs):
#     username = kwargs['request'].user.username
#     # username = kwargs['user'].username
#     print(username)
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

# @receiver(user_signed_up)
# def employeeID(request, user, **kwargs):
#     # username = kwargs['request'].user.username
#     username = kwargs['user'].username
#     print(username)
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

Django 版本:2.0

Python 3.6.2

*用户注册邮箱(无需验证)和密码

目标:在 django-allauth 注册后立即用我自己的用户名更改自动生成的用户名。

问题:我不确定信号是否不起作用或是否出现,或者我的代码有问题,但我无法用自己的方式更改自动生成的 django allauth 用户名。 我还在此处发布了我尝试的各种迭代(已注释掉)。这些只是最近几天我的代码的如此多的迭代和尝试中的一小部分。到目前为止,我已经花了整个星期五+星期六来实现这一目标。 我参考了以下资源并尝试模仿或调整它们以适应我的用例,但没有成功。

Django - User and User Profile form creating two profiles instead of one
How to populate user profile with django-allauth provider information?
IndexError, list index out of range. Django-allauth signals
django-allauth: how to properly use email_confirmed signal to set user to active
How to populate user profile with django-allauth provider information?
django django-allauth save extra_data from social login in signal

【问题讨论】:

    标签: python django django-allauth


    【解决方案1】:

    你应该使用pre_save来保存用户名,你可以这样做更方便,这里我可以为你提供生成用户名的功能

    def unique_username_generator(instance, new_username=None):
    
        #user_str = get_first_name(instance.name)
    
        #In your case
         user_str = instance.username 
    
        if new_username is not None:
            username = new_username
    
        else:
            user_num = random.randint(1,391020931223)
            username = '{user_str}_{user_num}'.format(user_num=user_num,
                        user_str=user_str)
    
        klass = instance.__class__
    
        qs_exists = klass.objects.filter(username=username).exists()
        if qs_exists:
            user_num = random.randint(1,391020931223)
            new_username = '{user_str}_{user_num}'.format(user_num=user_num,
                        user_str=user_str)
            return unique_username_generator(instance,new_username=new_username)
    
        return username
    

    编辑它并使用您自己的方法在您的模型中生成用户名

    def username_pre_save_receiver(sender, instance, *args, **kwargs):
        if not instance.username:
            instance.username = unique_username_generator(instance)
    
    pre_save.connect(username_pre_save_receiver, sender=User)
    

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 2018-06-26
      • 2015-01-22
      • 2011-09-03
      • 2019-06-26
      • 2014-07-23
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多