簡體   English   中英

如何在基於Django類的視圖中訪問當前用戶

[英]How to access current user in Django class based view

我無法在基於Django類的視圖中訪問當前登錄的用戶:

models.py:

class Userproject(models.Model):
class Meta:
    verbose_name = u'pp'
    verbose_name_plural = u'pps'

user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="project", verbose_name=_("Владелец проекта"))
#user = models.ForeignKey(User, unique=True)

name = models.TextField(u'Название проекта', unique=True)
date_created = models.DateTimeField(u'Дата создания', default=datetime.now(), db_index=True)
date_until = models.DateTimeField(u'Оплачен по', default=datetime.now(), db_index=True)

views.py:

@login_required
class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    queryset = Userproject.objects.filter(user=self.request.user)
    template_name = 'userproject_list.html'  

當我導航到url時,我看到錯誤: 名稱'self'未定義

如果我將self.request.user更改為request.user,則錯誤為:name'request '未定義

請注意,沒有用戶過濾視圖正在工作並顯示數據django 1.8.5

你可以覆蓋get_queryset

@login_required
class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'
    def get_queryset(self):
        return Userproject.objects.filter(user=self.request.user)

你也不能在類上使用裝飾器 ,所以你必須寫這樣的東西:

from django.utils.decorators import method_decorator

class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(UserprojectList, self).dispatch(*args, **kwargs)

    def get_queryset(self):
        return Userproject.objects.filter(user=self.request.user)

我會嘗試在__init__方法中執行此操作:

@login_required
class UserprojectList(ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'
    def __init__(self, *args, **kwargs):
        super(UserprojectList, self).__init__(*args, **kwargs)
        self.queryset = Userproject.objects.filter(user=self.request.user)

我認為在基於類的視圖中,您需要覆蓋get_queryset()方法,以便能夠訪問附加到視圖實例的self.request對象,而不是在類級別執行此操作。 Classy Class-Based Views網站提供了更多信息: http//ccbv.co.uk/projects/Django/1.8/django.views.generic.list/ListView/

@ pythad的回答是正確的。 但是在Django 1.9+上,您可以使用django.contrib.auth.mixins.LoginRequiredMixin替換舊式的@login_required裝飾器,而不是dispatch方法。

from django.contrib.auth.mixins import LoginRequiredMixin

class UserprojectList(LoginRequiredMixin, ListView):
    context_object_name = 'userproject_list'
    template_name = 'userproject_list.html'

    def get_queryset(self):
        return Userproject.objects.filter(user=self.request.user)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM