如果不存在,Django会创建userprofile

时间:2010-09-14 08:59:57

标签: django

我在代码中的许多地方使用request.user.get_profile()。但是,并非所有用户都拥有与其帐户相关联的用户个人资料。是否有某种方法可以在调用request.user.get_profile()时自动创建用户个人资料,如果他们没有,则无需更改每个request.user.get_profile()来电。也许使用信号或其他东西。

我遇到的问题是我使用单点登录登录,所以如果有人登录到另一个系统,然后进入我的网站,他们就会登录但是没有创建用户个人资料(我创建了一个用户个人资料当他们登录时。)

5 个答案:

答案 0 :(得分:22)

通常在创建用户实例后立即创建用户配置文件对象。这可以通过信号轻松完成。

  

我遇到的问题是我使用单点登录登录,所以如果有人登录到另一个系统,然后进入我的网站,他们就会登录但是没有创建用户个人资料(我创建了一个用户个人资料当他们登录时。)

显然在用户创建时使用信号对您不起作用。完成您尝试执行的操作的一种方法是使用自定义函数替换对request.user.get_profile()的调用。说get_or_create_user_profile(request)。此函数可以尝试检索用户的配置文件,然后如果不存在则动态创建一个。

例如:

def get_or_create_user_profile(request):
    profile = None
    user = request.user
    try:
        profile = user.get_profile()
    except UserProfile.DoesNotExist:
        profile = UserProfile.objects.create(user, ...)
    return profile

答案 1 :(得分:3)

我发现我想在此网站上使用此解决方案:http://www.turnkeylinux.org/blog/django-profile

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

使用这样的属性似乎比定义新方法更简洁,但我同意,通过代码库并更改user.get_profile()user.profile的引用会很困难。

那么,这不是你的全局文件搜索和替换功能的用途吗?

答案 2 :(得分:2)

基于bskinner的回答并回应sqwerty的评论,您可以使用:

def get_or_create_profile(user):
    """
    Return the UserProfile for the given user, creating one if it does not exist.

    This will also set user.profile to cache the result.
    """
    user.profile, c = UserProfile.objects.get_or_create(user=user)
    return user.profile

User.profile = property(get_or_create_profile)

因此,如果需要,这会创建个人资料,User.profile.field = "deep"然后User.profile.save()可以使用。

答案 3 :(得分:2)

修改如下。否则,将显示“AttributeError:无法设置属性”。监护人分配许可在这里是可选的。

def get_or_create_profile(user):
    profile, created = UserProfile.objects.get_or_create(user=user)
    assign('change_userprofile', user, profile)
    assign('delete_userprofile', user, profile)
    return profile

User.profile = property(get_or_create_profile)

答案 4 :(得分:1)

这是一个快速管理命令,可用于为缺少这些命令的任何用户创建默认配置文件。有了这个,您可以随时运行./manage.py missing_profiles,或将其添加到cron作业等。

from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from people.models import Profile

'''
Create default profiles for any User objects that lack them.
'''


class Command(BaseCommand):
    help = "Create default profiles for any User objects that lack them."

    def handle(self, *args, **options):
        users = User.objects.filter(profile=None)
        for u in users:
            Profile.objects.create(user=u)
            print("Created profile for {u}".format(u=u))