Django Middleware - объект AnonymousUser не повторяется - PullRequest
1 голос
/ 07 ноября 2019

Соответствующий вопрос для контекста / кода: Мое промежуточное ПО Django работает не так, как должно

Так что я только что получил помощь и получил ответ на другой вопрос, связанный с этим, но послеЯ добавлял код, который узнал сейчас, каждый раз, когда пользователь, который не вошел в систему, просматривает сайт, он видит ошибку ниже, поэтому любая помощь будет оценена. Спасибо

Ошибка: 'AnonymousUser' object is not iterable

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

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

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}"

1 Ответ

0 голосов
/ 07 ноября 2019

Измените код следующим образом:

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

Пояснение

Я проверяю, пользователь is_authenticated или нет. Если не аутентифицирован, то нет смысла проверять, забанен или нет. Затем я запрашиваю модель UserBanning, чтобы проверить, является ли пользователь exists().

...