首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django - 'AnonymousUser‘对象不可迭代,因为我在上下文处理器中使用了用户过滤器

Django - 'AnonymousUser‘对象不可迭代,因为我在上下文处理器中使用了用户过滤器
EN

Stack Overflow用户
提问于 2018-06-10 18:47:48
回答 2查看 2K关注 0票数 1

我使用context_processorts.py将某种类型的过滤器传递到整个项目中,但它只在用户登录时才起作用,当没有用户登录时,它会返回一个错误。以下是我的文件:

context_processors.py

代码语言:javascript
复制
def include_user_favs(request, user_favs=None):
    if request.user.is_anonymous:
        pass
    else:
        user_favs = Favorite.objects.filter(user=request.user)

    context = {
        'user_favs': user_favs,
    }

    return (context)

然后包含在settings.py中,如下所示:

代码语言:javascript
复制
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'fostania.context_processors.include_name_list',
                'fostania.context_processors.include_current_user',
                'fostania.context_processors.include_dress_need',
                'fostania.context_processors.include_all_ads',
                'fostania.context_processors.include_new_messages',
                'fostania.context_processors.include_user_favs',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

然后这就是我在HTML中使用的方式

home.html

代码语言:javascript
复制
                               {% if user_favs %}
                      {% for item in user_favs %}
                  {% if item.item == dress %}
                                                      <a href="{% url 'favorite_item' dress.id %}">
                  <img src="{% static 'img/star-yes.png' %}" title="مسح من  الفساتين المفضلة"></a>
{% else %}

                                <a href="{% url 'favorite_item' dress.id %}">
                  <img src="{% static 'img/star_no.png' %}" title="إضافة إلى الفساتين المفضلة"></a>

                          {% endif %}
                          {% endfor %}
              {% else %}
                                              <a href="{% url 'favorite_item' dress.id %}">
                  <img src="{% static 'img/star_no.png' %}" title="إضافة إلى الفساتين المفضلة"></a>
              {% endif %}

下面是错误和回溯:

'AnonymousUser' object is not iterable

代码语言:javascript
复制
Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/

Django Version: 2.0.5
Python Version: 3.6.5
Installed Applications:
['django_filters',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'fostania_web_app.apps.FostaniaWebAppConfig']
Installed Middleware:
('whitenoise.middleware.WhiteNoiseMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 '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 "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\python\Django\fostania\fostania_web_app\views.py" in home
  17.     user_favs = Favorite.objects.filter(user=request.user)

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py" in filter
  836.         return self._filter_or_exclude(False, *args, **kwargs)

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py" in _filter_or_exclude
  854.             clone.query.add_q(Q(*args, **kwargs))

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\query.py" in add_q
  1253.         clause, _ = self._add_q(q_object, self.used_aliases)

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\query.py" in _add_q
  1277.                     split_subq=split_subq,

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\query.py" in build_filter
  1187.             self.check_related_objects(join_info.final_field, value, join_info.opts)

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\sql\query.py" in check_related_objects
  1052.                 for v in value:

File "C:\Users\Dev3\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\utils\functional.py" in inner
  216.         return func(self._wrapped, *args)

Exception Type: TypeError at /
Exception Value: 'AnonymousUser' object is not iterable
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-10 18:53:43

您可以使用is_authenticated

始终为True的Read-only属性(与始终为False的AnonymousUser.is_authenticated相反)

代码语言:javascript
复制
def include_user_favs(request, user_favs=None):
    if not request.user.is_authenticated:
        user_favs = Favorite.objects.filter(user=request.user)

    context = {
        'user_favs': user_favs,
    }

    return (context)
票数 1
EN

Stack Overflow用户

发布于 2018-06-10 19:24:12

多亏了@zimdero和@Alasdair,我发现我在另一个视图函数中使用了user_favs = Favorite.objects.filter(user=request.user)行,所以它被context_processors.py views.py 调用了2次,这导致了错误,即在我从views.py中删除它后,解决了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50782897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档