2014-11-20 227 views
0

在編寫視圖時,顯然是一種很好的習慣 - 如果不是強制的 - 使用@login_required裝飾器。Django @login_required裝飾器

但 - 只爲

from django.contrib.auth.models import User 

用戶進行認證檢查,我想做到的是還檢查用戶是否存在爲用戶配置。 在我的應用程序中,例如,我有一些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): 
    ... 
相關問題