Django Middleware-'AnonymousUser'对象不可迭代 [英] Django Middleware - 'AnonymousUser' object is not iterable

查看:117
本文介绍了Django Middleware-'AnonymousUser'对象不可迭代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

上下文/代码的相关问题:我的Django中间件无法正常工作

Related question for context/code: My Django Middleware Isn't Working The Way It Should

因此,我刚刚获得帮助,并回答了与此问题有关的其他问题,但是在添加代码后,每次没有登录的用户查看该站点时,他们现在都看到下面的错误,因此我发现了这一点,因此,不胜感激.谢谢

So I just got help and got my other question related to this one answered but after I added the code I found out now every time a user who isn't signed in views the site they see the error below so any help with be appreciated. Thanks

错误:'AnonymousUser' object is not iterable

C:\Users\...\account\banning\middleware.py in __call__
        if(UserBanning.objects.filter(ban=True, user=request.user)): …

middleware.py:

middleware.py:

from .models import UserBanning
from django.shortcuts import render, redirect


class BanManagement():
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if(UserBanning.objects.filter(ban=True, user=request.user)):
            context = {
                'banned': banned[0],
            }
            return render(request, "account/banned.html", context)
        else:
            response = self.get_response(request)
            return response

models.py

models.py

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings

class UserBanning(models.Model):
    user = models.ForeignKey(User, verbose_name="Username", help_text="Choose Username", on_delete=models.CASCADE)
    ban = models.BooleanField(default=True, verbose_name="Ban", help_text="Users Bans")
    reason = models.CharField(max_length=500, blank=True)

    class Meta:
        verbose_name_plural = "User Banning"
        ordering = ('user',)

    def __str__(self):
        return f"{self.user}"

推荐答案

更改代码如下:

def __call__(self, request):

    if request.user.is_authenticated:
        banned = UserBanning.objects.filter(ban=True, user=request.user)
        if banned.exists():
            context = {
                'banned': banned[0],
            }
            return render(request, "account/banned.html", context)

    response = self.get_response(request)
    return response

说明

我正在检查用户 exists() .

Explanation

I am checking if user is_authenticated or not. If not authenticated, then there is no point for checking banned or not. Then I am querying through UserBanning model to check if the user exists().

这篇关于Django Middleware-'AnonymousUser'对象不可迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆