如何检查用户是否已登录

14

我正在开发一个发票管理系统,用户可以添加发票数据并保存到数据库中。每当用户登录时,该数据将显示在主页上。但是,每当用户注销并尝试访问主页时,却出现以下错误。

TypeError at /

'AnonymousUser' object is not iterable

我尝试了AnonymousUser.is_authenticated方法,但仍然无法工作。

如果用户已登录,则应打开home.html,否则应打开intro.html

这是我的代码views.py


from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import (
    ListView,
    DetailView,
    CreateView,
    UpdateView,
    DeleteView
)
from .models import Invoicelist

def home(request):

    if request.user.is_authenticated():
        context = {
        'invoices': Invoicelist.objects.all()
        }
        return render(request, 'invoicedata/home.html', context)

    else:
        return render(request, 'invoicedata/intro.html', context)

主页.html

{% extends "invoicedata/base.html" %}
{% block content %}
      {% for invoice in invoices %}
      <article class="media content-section">
        <div class="media-body">
          <div class="article-metadata">
            <small class="text-muted">{{ invoice.date_posted|date:"F d, Y" }}</small>
            <h2><a class="article-title" href="{% url 'invoice-detail' invoice.id %}">{{ invoice.issuer }}</a></h2>
          </div>

          <p class="article-content">{{ invoice.invoice_number }}</p>
          <p class="article-content">{{ invoice.date }}</p>
          <p class="article-content">{{ invoice.amount }}</p>
          <p class="article-content">{{ invoice.currency }}</p>
          <p class="article-content">{{ invoice.other }}</p>
          <div class="article-metadata">
            <small class="text-muted">{{ invoice.author }}</small>
          </div>

        </div>
      </article>
      {% endfor %}
{% endblock content %}

介绍.html

{% extends "invoicedata/base.html" %}
{% block content %}
    <h2>login to your portal for great auditing services</h2>
{% endblock content %}
4个回答

10

最终我找到了适合我的解决方案

在这里:

Django提供了LoginRequiredMixin,我在我的invoicelistview函数中使用了它

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin

class InvoiceListView(LoginRequiredMixin,ListView):
    model = Invoicelist
    template_name = 'invoicedata/home.html'
    context_object_name = 'invoices'

    def get_queryset(self):
        return self.model.objects.all().filter(author=self.request.user).order_by('-date_posted')[:2]

就是这样了。现在每当用户注销时,它将重定向到登录页面


8

我知道这个问题已经被回答了,我只是想总结一下每种隐藏/显示信息的方法,以便非认证用户使用。

1. 登录要求装饰器

如果您正在处理功能视图,可以像这样进行装饰:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    pass

这将仅向已认证的用户显示视图。如果是匿名用户,它们将被重定向到登录URL(settings.LOGIN_URL)。
2. LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

以下是基于类的视图。来自Django文档:

如果视图使用此mixin,所有非经过身份验证的用户的请求将被重定向到登录页面或显示HTTP 403禁止错误,具体取决于raise_exception参数。

与上一种方法一样,您可以自定义login_urlredirect_field_name

3. 基于类的视图方法装饰器

from django.utils.decorators import method_decorator

class ProtectedView(TemplateView):
    template_name = 'secret.html'

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

4. HTML模板化

最后,如果您只想对未经身份验证的用户隐藏某些特定的HTML块,可以像这样将其包装起来:

{% if user.is_authenticated %}
   <p> Hidden content! </p>
    <!-- You can also access the user data like this -->
   <p> {{ {{ request.user }} }} </p>
{% endif %}

嘿,马丁,谢谢你的回复。实际上我想为这个问题 https://dev59.com/kLroa4cB1Zd3GeqPj2vA 提供悬赏,但不小心把它给了这个问题。我知道这很愚蠢,对你造成的不便我感到抱歉。但如果你能回答上述问题,那么我可以把悬赏给你。谢谢。 - Mayur Satav
我不明白,另一个问题与此无关且没有赏金:没关系! - martin
@Mayur Satav,您可以请勾选此答案吗? - martin

4
在 HTML 上下文中,您可以执行以下操作:
{% if user.is_authenticated %} 
        # some arbitary stuff
        <li class="nav-item">
            <a class="nav-link" href="#"><strong>{{ user.username }}</strong></a>
        </li>
{% endif %}

然后在Python环境中,您可以执行以下操作:

from django.contrib.auth.decorators import login_required

@login_required
function stuff():
.....

@login_required应该作为前缀用于任何仅可由已登录用户运行的函数。

编辑:针对您特定的情况,您只需要执行以下操作:

if request.user.is_authenticated:


嘿,logankilpatrick感谢你的回复。我尝试了你的解决方案,但仍然无法工作。实际上,如果用户已登录,则我想要从相同的主页函数呈现主页,否则呈现介绍页面。 - Mayur Satav
1
在你的索引中,你可以这样做:if request.user.is_authenticated: 如果为真,则渲染homepage.html,否则渲染介绍页面。 - logankilpatrick
我尝试了但仍然不起作用,仍然出现相同的错误,即在/处出现TypeError:'AnonymousUser'对象不可迭代。 - Mayur Satav

1
在本文中,我们将介绍如何在Django中检查用户是否已登录。
因此,有几种方法可以实现这一点,但我们要介绍的方式是使用Django中的请求对象。
通过调用request.user,我们可以访问当前已登录的用户。
然后,我们可以使用is_authenticated()函数来确定用户是否已经过身份验证(登录到账户)。
因此,我们将创建一个简单的脚本,如果用户已登录,我们将打印“已登录”,如果用户未登录,则将打印“未登录”。
基本上,我们都在views.py文件中完成这些操作,该文件是我们的主要Python代码始终放置的位置。
下面是代码示例。
def index(request):
    if request.user.is_authenticated():
        print("Logged in")
    else:
        print("Not logged in")

在这段代码中,在我们的views.py文件中,我们有一个名为index的函数,它被传入了参数request。

request.user引用了已登录的用户(如果没有登录,则不是)。然后,is_authenticated()函数检查用户是否已认证(已登录)。

如果是,我们打印出“已登录”。如果不是,我们打印出“未登录”。

当然,除了仅打印这些语句之外,还可以做许多其他事情。

如果有用户已登录,我们可以呈现一个模板。如果没有人登录,则可以呈现另一个模板。

其他可做的事情包括:如果用户已登录,我们可以呈现一个模板。如果没有,则可以引发404页面未找到错误。

还有一件事可以做,如果用户已登录,我们可以呈现一个模板。如果没有,则可以将用户重定向到登录页面。

因此,基于用户是否已登录,可以执行几个操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接