“AnonymousUser”对象不可迭代?Django

10
我正在创建一个用户所有帖子的摘要页面,并将这些帖子返回到摘要页面。我会得到上面的错误吗?
它在抱怨这一行:
uploaded_aircraft = Aircraft.objects.filter(user=request.user)

查看

def aircraft_create(request):
  form = aircraft_form(request.POST or None)
  if form.is_valid():
    instance = form.save(commit=False)
    instance.user = request.user
    instance.save()
    messages.success(request, "Your upload has been successfully added!")
    return HttpResponseRedirect(instance.get_absolute_url())
  else:
    messages.error(request, "There seems to be something wrong. Have a look again..!")
  context = {"form":form,}
  return render(request,'aircraft/aircraft_form.html', context)

模型

class Aircraft(AircraftModelBase):
    user = models.ForeignKey(User)
    manufacturer = SortableForeignKey(Manufacturer)
    aircraft_type = SortableForeignKey(AircraftType)

查看

def account_overview(request):
    fav_aircraft = FavoritedAircraft.objects.filter(user__id=request.user.id)
    fav_airline = FavoritedAirline.objects.filter(user__id=request.user.id)

    uploaded_aircraft = Aircraft.objects.filter(user=request.user)

    return render(request,'account/account_overview.html', {'favAircraft':fav_aircraft,
                                                             'favAirline':fav_airline,
                                                             'UploadedAircraft':uploaded_aircraft})

回溯(Traceback)

Traceback (most recent call last):
  File "/home/csunix/scpython/lib/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/csunix/scpython/lib/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/cserv1_a/soc_ug/sc13nh/env/v10/accounts/views.py", line 57, in account_overview
    uploaded_aircraft = Aircraft.objects.filter(user=request.user)
  File "/home/csunix/scpython/lib/django/db/models/manager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/csunix/scpython/lib/django/db/models/query.py", line 790, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/csunix/scpython/lib/django/db/models/query.py", line 808, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/csunix/scpython/lib/django/db/models/sql/query.py", line 1243, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/csunix/scpython/lib/django/db/models/sql/query.py", line 1269, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/csunix/scpython/lib/django/db/models/sql/query.py", line 1174, in build_filter
    self.check_related_objects(field, value, opts)
  File "/home/csunix/scpython/lib/django/db/models/sql/query.py", line 1073, in check_related_objects
    for v in value:
  File "/home/csunix/scpython/lib/django/utils/functional.py", line 205, in inner
    return func(self._wrapped, *args)
TypeError: 'AnonymousUser' object is not iterable

这里似乎是实际问题所在?


1
如果你遇到了错误,请在你的问题中包含完整的追踪回溯信息。 - Alasdair
@Alasdair 完成了! - Pakin Sife
3
顺便提一下,在其他筛选器中,您不应该需要使用user__id=request.user.iduser=request.user应该可以正常工作(只要用户已登录)。 - Alasdair
5个回答

20
错误提示你,request.user是匿名用户,也就是说他们没有登录,所以使用filter(user=request.user)筛选并不合理。

最简单的解决方法是使用login_required装饰器,确保只有已经登录的用户才能访问该视图。
from django.contrib.auth.decorators import login_required

@login_required
def account_overview(request):
    ...

在我的模板中,我已经加入了 "{% if user.is_authenticated %} else "请登录" 这行代码,但是添加后页面返回一个 404 错误。我应该如何让 else 的部分生效?它应该放在视图函数还是模板中? - Pakin Sife
1
现在在模板中进行检查已经太晚了——过滤器已经在视图中发生了。 login_required 装饰器会将未登录用户重定向到登录页面。如果您的 LOGIN_URL 设置和登录视图配置不正确,那么可能会出现 404 错误。如果您无法解决此问题,请提出一个新的问题。 - Alasdair

6

def account_overview(request):

 if request.user.is_authenticated:  # Notice this condition
    fav_aircraft = FavoritedAircraft.objects.filter(user__id=request.user.id)
    fav_airline = FavoritedAirline.objects.filter(user__id=request.user.id)

    uploaded_aircraft = Aircraft.objects.filter(user=request.user)
    return render(request,'account/account_overview.html', {'favAircraft':fav_aircraft,
                                                         'favAirline':fav_airline,
                                                         'UploadedAircraft':uploaded_aircraft})
   return render(request,'account/account_overview.html')

这应该能解决你的问题:用is_authenticated条件语句包装视图,只有在用户通过身份验证时才返回上下文。

现在我得到了 名称'request'未定义 - AnonymousUser
添加 self.request.user.is_authenticated 解决了问题。 - AnonymousUser

1

虽然在您的情况下它不起作用(因为您使用方法而不是类),但您可以通过LoginRequiredMixin解决这个问题:

from django.contrib.auth.mixins import LoginRequiredMixin

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

0

我几分钟前遇到了这个问题,发现两种解决方法:

  1. 在视图顶部实现 @login_required。这样,如果用户未经身份验证,将被重定向到登录页面。

  2. 在视图函数的顶部编写 'if request.user.is_authenticated'。还应该在底部添加一个 else 块来呈现登录页面。

希望这对您有所帮助


0

我之前也遇到了同样的问题,通过注销然后重新登录解决了它。

目前来看,我认为这可能是一个简单的修复。


//Hello world program in Java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } - phoenixstudio

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