2016-10-23 54 views
0

我正在使用Django 1.10。我有以下設置:爲什麼Django認證不能識別request.user變量?

settings.py:

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'IFTHQ', 
    'rest_framework' 
] 

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

Views.py:

from django.shortcuts import render 
from IFTHQ import models 
from django.contrib.auth.decorators import login_required 
# Create your views here. 


def home(request): 
    """A view of all bands.""" 
    return render(request, 'IFTHQ/publicpages/front.html') 


@login_required(login_url="login/") 
def dashboard(request): 
    member = models.Member.objects.get(id=request.user.id) 
    data = {} 
    data["profile"] = member 
    return render(request, 'IFTHQ/dashboard/dashboard.html', {"data": data}) 

@login_required(login_url="login/") 
def membership(request): 
    data = {} 
    data["profile"] = member 
    return render(request, 'IFTHQ/dashboard/membership.html', {"data": data}) 

我證實,有一名成員在成員對象,但是,當我登錄時,我得到這個錯誤:

Environment: 


Request Method: GET 
Request URL: http://<<domain>>/ 

Django Version: 1.10.2 
Python Version: 3.5.2 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'IFTHQ', 
'rest_framework'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 

File "/home/arcee123/trekfed/trekfed/IFTHQ/views.py" in dashboard 
    14.  member = models.Member.objects.get(id=request.user.id) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/db/models/manager.py" in manager_method 
    85.     return getattr(self.get_queryset(), name)(*args, **kwargs) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/db/models/query.py" in get 
    385.     self.model._meta.object_name 

Exception Type: DoesNotExist at/
Exception Value: Member matching query does not exist. 

它似乎沒有找到request.user.id的成員。我錯過了什麼?謝謝。

更新1: 會員型號:

class Member(models.Model): 
    User = models.OneToOneField(User, related_name='user') 
    FID = models.FloatField() 
    backup_email = models.CharField(max_length=512) 
    FName = models.CharField(max_length=100) 
    MName = models.CharField(max_length=100, blank=True) 
    LName = models.CharField(max_length=100) 
    Avatar = models.FileField(upload_to='Avatar/%Y/%m/%d', blank=True) 
    Cover = models.FileField(upload_to='Cover/%Y/%m/%d', blank=True) 
    Facebook = models.URLField(default='', blank=True) 
    GooglePlus = models.URLField(default='', blank=True) 
    Twitter = models.URLField(default='', blank=True) 
    Website = models.URLField(default='', blank=True) 
    Bio = models.TextField(default='', blank=True) 
    GENDER_CHOICES = (
     ('M', 'Male'), 
     ('F', 'Female'), 
    ) 
    Gender = models.CharField(max_length=1, choices=GENDER_CHOICES) 
    Hair_Choices = (
     ('Blond', 'Blond'), 
     ('Black', 'Black'), 
     ('Brown', 'Brown'), 
     ('Brunette', 'Brunette'), 
     ('Red', 'Red'), 
     ('Auburn', 'Auburn'), 
     ('Gray', 'Gray'), 
     ('White', 'White'), 
     ('Colorful', 'Colorful'), 
     ('None', 'None'), 
     ('N/A', 'Not Applicable') 
    ) 
    Hair = models.CharField(max_length=25, choices=Hair_Choices) 
    Height = models.FloatField() 

    def __str__(self): 
     return self.FName + " " + self.LName 

    def shortrank(self): 
     return Rank.objects.filter(User=self.id).order_by("-date_promoted")[0].Rank.SName 

    def currentrank(self): 
     return Rank.objects.filter(User=self.id).order_by("-date_promoted")[0].Rank.LongName 

    def rank_img(self): 
     return Rank.objects.filter(User=self.id).order_by("-date_promoted")[0].Rank.image 

    def primary_address(self): 
     return MemberAddress.objects.get(AddressFK=self.id, Default=True) 

    def primary_phone(self): 
     return MemberPhone.objects.get(PhoneFK=self.id, Default=True) 

    def awards(self): 
     return Award.objects.filter(Member=self.id) 

這張截圖顯示連接確實存在。

enter image description here

更新2: models.py:

class Member(models.Model): 
    User = models.OneToOneField(User) 
    ...<More>... 

Views.py:

@login_required(login_url="login/") 
def dashboard(request): 
    member = request.user.member 
    data = {} 
    data["profile"] = member 
    return render(request, 'IFTHQ/dashboard/dashboard.html', {"data": data}) 

新的錯誤:

Environment: 


Request Method: GET 
Request URL: <<domain.com>> 

Django Version: 1.10.2 
Python Version: 3.5.2 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'IFTHQ', 
'rest_framework'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 

File "/home/arcee123/trekfed/trekfed/IFTHQ/views.py" in dashboard 
    14.  member = request.user.member 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/utils/functional.py" in inner 
    235.   return func(self._wrapped, *args) 

File "/home/arcee123/trekfed/env-trekfed/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py" in __get__ 
    370.      self.related.get_accessor_name() 

Exception Type: RelatedObjectDoesNotExist at/
Exception Value: User has no member. 
+0

「我確認了成員對象中有一個成員」你是什麼意思? 「Member」類是什麼樣的? –

+0

因爲根本沒有一個id等於相關用戶ID的成員?這裏'get_object_or_404'可能更合適。 – Evert

+0

好的。我更新了這個問題。這表明模型和價值確實存在。 – arcee123

回答

0

request.user.id爲您提供用戶表中的ID。如果你想獲取相關成員,那麼你應該過濾user字段,而不是id字段。

member = models.Member.objects.get(user=request.user.id) 

如果從外鍵刪除related_name='user',那麼你可以簡單地做:

member = request.user.member 

隨着related_name='user',你可以做member = request.user.user。然而,這是令人困惑的,因爲關注後退給你Member,而不是User

+0

好的。我做了第一個建議,UPDATE 2顯示了這個響應。我只是不明白爲什麼這可以在我的本地機器上運行,但是其他服務器會死機。非常感謝。 – arcee123

+0

如錯誤所述,您尚未爲服務器數據庫中的登錄用戶創建一個「成員」。你或者需要確保你總是在'User'的同時創建'Member',或者你需要讓你的代碼處理'DoesNotExist'異常。 – Alasdair

相關問題