我在代码中的许多地方使用request.user.get_profile()
。但是,并非所有用户都拥有与其帐户相关联的用户个人资料。是否有某种方法可以在调用request.user.get_profile()
时自动创建用户个人资料,如果他们没有,则无需更改每个request.user.get_profile()
来电。也许使用信号或其他东西。
我遇到的问题是我使用单点登录登录,所以如果有人登录到另一个系统,然后进入我的网站,他们就会登录但是没有创建用户个人资料(我创建了一个用户个人资料当他们登录时。)
答案 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))