2014-11-20 2 views
0

При написании представлений, очевидно, хорошая практика - если не обязательная - использовать декоратор @login_required.Django @login_required decorator

НО - это только проверяет подлинность пользователей из

from django.contrib.auth.models import User 

То, что я хочу сделать это также проверить, что пользователь существует как UserProfile. В моем приложении, например, у меня есть некоторые UserProfiles. У всех есть объекты Пользователя, связанные с ними, конечно. , но у меня также есть другие пользователи, у которых нет UserProfile. Такой пользователь - мой администратор. Я хочу, чтобы запросы поступали от пользователей, у которых есть UserProfiles (и они аутентифицированы).

Есть ли способ изменить декоратор, чтобы поддержать это? В настоящее время я просто написал свой собственный код, чтобы сделать это:

def user_login(request): 
    context = context = RequestContext(request) 

    if request.method == 'POST': 
    username = request.POST['username'] 
    password = request.POST['password'] 
    try: 
     user = authenticate(username=username, password=password) 
     user_profile = user.userprofile 
    except (ObjectDoesNotExist,AttributeError) as e: 
     # username and password only prompted for debug purposes. 
     error_msg = "Invalid login details: {0}, {1}".format(username, password) 
     print (error_msg) 
     # print (request) 
     # return HttpResponse("Invalid login details supplied.") 
     return render(request, 'bz/login.html', {'error_msg': error_msg}) 

    if user and user_profile: 
     if user.is_active: 
     login(request,user) 
     # return HttpResponse("You're now logged in as " + username) 
     # return render(request, 'bz/index.html', {}) 
     return render(request, 'bz/index.html', {'userprofile': user_profile}) 
     # return HttpResponseRedirect('bz/login.html') 
     else: 
     error_msg = "Your account is disabled" 
     print (error_msg) 
     return render(request, 'bz/login.html', {'error_msg': error_msg}) 
     # return HttpResponse(error_msg) 
    else: 
     error_msg = "Invalid login details: {0}, {1}".format(username, password) 
     print (error_msg) 
     return render(request, 'bz/login.html', {'error_msg': error_msg}) 
     # return HttpResponse("Invalid login details supplied.") 
    else: 
    if request.user.is_authenticated(): 
     return render(request, 'bz/index.html', {}) 
    else: 
     return render(request, 'bz/login.html', {}) 

Ваш вклад будет очень высоко ценится. Спасибо.

ответ

2

Вы можете использовать user_passes_test декоратора взять функцию, которая проверяет в профиле пользователя

например

def has_user_profile(user): 
    #return a True if one exists, else False 

@login_required 
@user_passes_test(has_user_profile) 
def my_view(request): 
    ... 
Смежные вопросы