Django создайте userprofile, если не существует - PullRequest
18 голосов
/ 14 сентября 2010

Я использую request.user.get_profile() в ряде мест в моем коде. Однако не все пользователи имеют профиль пользователя, связанный с их учетной записью. Есть ли способ, которым я могу автоматически создать профиль пользователя при вызове request.user.get_profile(), если у него его нет, не меняя каждый из моих вызовов request.user.get_profile(). Может быть, используя сигналы или что-то.

Проблема, с которой я столкнулся, заключается в том, что я использую единый вход в систему, поэтому, если кто-то входит в другую систему, а затем заходит на мой сайт, он входит в систему, но не создает профиль пользователя (я создаю профиль пользователя когда они залогинятся).

Ответы [ 5 ]

22 голосов
/ 14 сентября 2010

Обычно объекты профиля пользователя создаются сразу после создания экземпляра пользователя.Это легко сделать с помощью сигналов.

Проблема, с которой я столкнулся, заключается в том, что я использую единый вход в систему, поэтому, если кто-то входит в другую систему и затем переходит на мой сайт, он входит в систему, ноне создается профиль пользователя (я создаю профиль пользователя при входе в систему).

Видимо, использование сигналов во время создания пользователя не будет работать для вас.Один из способов выполнить то, что вы пытаетесь сделать, - это заменить вызовы 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
3 голосов
/ 22 февраля 2012

Я нашел это решение, которое мне нравится использовать на этом сайте: 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 голосов
/ 20 июня 2013

Пересмотрено, как показано ниже. В противном случае будет отображаться «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)
2 голосов
/ 02 мая 2012

Опираясь на ответ 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() сработает.

1 голос
/ 13 февраля 2015

Вот команда быстрого управления, которую можно использовать для создания профилей по умолчанию для всех пользователей, у которых их нет. Благодаря этому вы можете в любой момент запустить ./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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...