Django - перенаправить на страницу входа, если ошибка запроса UserProfile не существует - PullRequest
2 голосов
/ 02 сентября 2010

Я расширил пользовательскую модель, используя метод UserProfile. Однако я иногда получаю сообщение об ошибке Django UserProfile matching query does not exist при выполнении запроса request.user.get_profile()

Я думаю, что это происходит, когда я вышел из системы, поэтому мой пользователь становится AnonymousUser. Можно ли каким-либо образом автоматически перенаправить пользователя обратно на страницу входа в систему, если UserProfile не существует.

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

Также я использую @login_required в своих вызовах функций, но, похоже, это не перенаправляет пользователя до того, как он получит эту ошибку.

У каждого зарегистрированного пользователя должна быть учетная запись UserProfile, так как она создается автоматически, если у нее ее нет при входе в систему.

Я также использую Django 1.1

Ответы [ 3 ]

2 голосов
/ 12 января 2011

это должно работать

def profile_required():
    def has_profile(user):
        try:
            user.get_profile()
        except:
            return False
        else:
            return True
    return user_passes_test(lambda u: has_profile(u))
0 голосов
/ 02 сентября 2010

Декоратор @login_required гарантирует, что пользователь вошел в систему. Эта ошибка, вероятно, происходит, потому что некоторые пользовательские записи не имеют UserProfile. Вы можете проверить это в оболочке

from django.contrib.auth.models import *
for u in User.objects.all():
    try:
        u.get_profile()
    except:
        print "%s does not have a profile" % u
0 голосов
/ 02 сентября 2010

поэтому думал о способе использования сигналов или о чем-то подобном, когда мне нужно сделать это только один раз.

AFAIK, вы не можете сделать это с помощью сигнала.

Однако вы можете создать собственный декоратор для замены login_required. Этот декоратор может обернуть login_required и проверить профиль пользователя. Затем вы можете заменить Django login_required своим собственным в операторе импорта.

...