【问题标题】:Django 2.1 Create Profile on User creationDjango 2.1 在用户创建时创建配置文件
【发布时间】:2019-01-28 06:06:30
【问题描述】:

我正在使用 Python(3.7) 和 Django(2.1) 开发一个项目,我需要在创建用户时创建用户配置文件。

这是我尝试过的:

来自models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    avatar = models.CharField(max_length=500, null=True)
    about = models.CharField(max_length=1000, null=True)
    slogan = models.CharField(max_length=500, null=True)
    profile_pic = models.FileField(upload_to='media/profile_pics', null=True)

    def __str__(self):
        return self.user.username

来自signals.py

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_profile(sender, instance, created, **kwargs):
    instance.profile.save()

来自urls.py

path('register/', views.RegisterUser.as_view(), name='register'),

来自views.py

def post(self, request, *args, **kwargs):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            messages.success(request, f'Account has been created for {username}!')
            form.save()
            return HttpResponseRedirect(reverse_lazy('login'))

        else:
            form = UserRegisterForm()
        return render(request, 'users/register.html', {'form': form})

来自forms.py

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ('username', 'email', 'first_name',
                  'last_name', 'password1', 'password2')

来自apps.py

class JobexpertappConfig(AppConfig):
    name = 'jobexpertapp'
    app_label = 'jobexpertapp'

    def ready(self):
        import jobexpertapp.signals

更新: 我还在我的网站上通过使用django-social-auth 使用facebook 身份验证并获取facebook 头像,我已经实现了两件事,(a)定义social_auth_pipeline.py(b):在settings.py 中添加SOCIAL_AUTH_PIPELINE

所以,

来自social_auth_pipeline.py

def save_avatar(backend, user, response, *args, **kwargs):
    try:
        profile = Profile.objects.get(user_id=user.id)
    except Profile.DoesNotExist:
        profile = Profile(user_id=user.id)

    if backend.name == 'facebook':
        profile.avatar = 'http://graph.facebook.com/{}/picture?type=large'.format(response['id'])

    profile.save()

来自settings.py

SOCIAL_AUTH_PIPELINE = (

    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
    # 'apps.users.pipeline.get_avatar',
    'jobexpertapp.social_auth_pipeline.save_avatar',
)

当我通过注册页面创建新帐户时,它会创建 user,但不会创建个人资料。 此外,在创建用户的控制台上找不到任何错误。 这里有什么问题?

提前致谢!

【问题讨论】:

  • 你的signals.py调用了吗?
  • 是的,在apps.py 我在ready 函数里面有import
  • 尝试从save_profile中删除@receiver(post_save, sender=User)
  • 嗨@ShafikurRahman,还是不行!
  • 试试这个def save_profile(sender, instance, **kwargs): instance.profile.save() 或者你可以检查终端是否显示任何日志?

标签: python django python-3.x django-models django-2.0


【解决方案1】:

我遇到了同样的问题。

我的信号在 Class UsersConfig(AppConfig) 中的“用户”/“apps.py”中:

def ready(self):
    import users.signals

对我有用的是以下内容。在 INSTALLED_APPS 列表中的 project/'settings.py' 中,我曾经列出我的应用程序及其名称(即“博客”、“用户”)。当我更改它并像这样列出它们时:'blog.apps.BlogConfig','users.apps.UsersConfig',在用户创建/保存时触发的配置文件创建/保存相应地起作用。

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2011-08-05
    相关资源
    最近更新 更多