TypeError at / 'AnonymousUser' object is not iterable

TypeError at /

‘AnonymousUser’ object is not iterable

this Error comes after i use context_processor to get cart items count. and it’s only working with authenticated users, but for anonymus user , it shows this error.
and as i understand the anonymus user not object like user from class model.
but how can i ignore if there is no authenticated user.
Context_processor

def BasketItemsCount(request):
	order_qs = Order.objects.filter(account=request.user, ordered=False)
	if order_qs.exists():
		order = order_qs[0]
		order_items_count = 0
		for item in order.items.all():
			item_quantity = item.quantity
			order_items_count += item_quantity
			context = {
				'order_items_count': order_items_count,
			}
			return context

HTML

<a href="#" class="item ui label">
{% if order_items_count %}
      <i class="large icons">
            <i class="shopping cart teal icon"></i>
            <span class="top right corner">{{ order_items_count }}</span>
      </i>                    
      {% else %}
      <i class="large icons">
            <i class="shopping cart icon"></i>
      </i>    
{% endif %}
</a>

What is the complete traceback for this error?

What code is being identified as the source of that error?

(I do not see in the code posted where you’re trying to iterate over the user.)

1 Like

Thanks for Help Ken.
Complete Track of Error:

Environment:


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

Django Version: 4.0.5
Python Version: 3.10.4
Installed Applications:
['django_countries',
 'debug_toolbar',
 'jazzmin',
 'Accounts.apps.AccountsConfig',
 'Products.apps.ProductsConfig',
 'Baskets.apps.BasketsConfig',
 'Pages.apps.PagesConfig',
 'Dashboard.apps.DashboardConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['debug_toolbar.middleware.DebugToolbarMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/response.py", line 92, in rendered_content
    return template.render(context, self._request)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/backends/django.py", line 62, in render
    return self.template.render(context)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/base.py", line 173, in render
    with context.bind_template(self):
  File "/usr/lib/python3.10/contextlib.py", line 135, in __enter__
    return next(self.gen)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/debug_toolbar/panels/templates/panel.py", line 45, in _request_context_bind_template
    context = processor(self.request)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/Baskets/context_processors.py", line 6, in BasketItemsCount
    order_qs = Order.objects.filter(account=request.user, ordered=False)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/query.py", line 1071, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/query.py", line 1089, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/query.py", line 1096, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1502, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1532, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1415, in build_filter
    self.check_related_objects(join_info.final_field, value, join_info.opts)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1228, in check_related_objects
    for v in value:
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/utils/functional.py", line 259, in inner
    return func(self._wrapped, *args)

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

What does the main view look like?

1 Like

Home Page View:

class HomeView(TemplateView):
    template_name = 'Home.html'

    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        context['page'] = 'Home'
        return context

add to cart View:

def ItemAddToBasketView(request, slug):
	product = get_object_or_404(Product, slug=slug)
	order_item, created = OrderItem.objects.get_or_create(product=product, account=request.user, ordered=False)
	order_qs = Order.objects.filter(account=request.user, ordered=False)
	if order_qs.exists():
		order = order_qs[0]
		if order.items.filter(product__slug=product.slug).exists():
			order_item.quantity += 1
			order_item.save()
			messages.success(request, f'{product} added Quantity is Updated in Basket.')
			return redirect('Pages:HomeView')
		else:
			order.items.add(order_item)
			order.save()
			messages.success(request, f'{product} added to Basket.')
			return redirect('Pages:HomeView')
	else:
		order = Order.objects.create(account=request.user, ordered=False, ordered_at=timezone.now())
		order.items.add(order_item)
		order.save()
		return redirect('Pages:HomeView')

In your Order model, is the account field a ForeignKey to User?

1 Like

Yes buddy,

Order Model:

class Order(models.Model):
	order_id = models.UUIDField(verbose_name=_('Order Number'), primary_key=True, default=uuid4, unique=True, editable=False)
	account = models.ForeignKey(Account, verbose_name=_('Order Account'), related_name='account_order', on_delete=models.CASCADE)
	items = models.ManyToManyField(OrderItem, verbose_name=_('Order Items'), related_name='items_order')
	ordered = models.BooleanField(verbose_name=_('Order Ordered'), default=False)
	created_at = models.DateTimeField(verbose_name=_('Order Created At'), auto_now_add=True, editable=False)
	ordered_at = models.DateTimeField(verbose_name=_('Order Ordered At'))

	def __str__(self):
		return f'Order Id: {self.order_id} - {self.account}.'

	def get_order_total_price(self):
		total = 0
		for order_item in self.items.all():
			total += order_item.get_total_product_price()
		return total

First, the bottom line - yes the problem is being caused by AnonymousUser being referenced.

I can’t explain why you’re getting that specific error, but AnonymousUser is not an instance of User.

Since you’re associating these Order instances with an Account, you’ll need to decide how you want to handle those orders for users without an Account.

(Is Account your custom user model, or is it a profile model with a one-to-one relationship with User?)

1 Like

Custom user model with AbstractBaseUser.

How about this still the same error, i suppose to have false in my template and render the page. but same error.

def BasketItemsCount(request):
	if request.user.is_anonymous:
		order_items_count = False
		context = {
			'order_items_count': order_items_count,
		}
		return context
	else:
		order_qs = Order.objects.filter(account=request.user, ordered=False)
		if order_qs.exists():
			order = order_qs[0]
			for item in order.items.all():
				item_quantity = item.quantity
				order_items_count += item_quantity
				context = {
					'order_items_count': order_items_count,
				}
				return context

I’m not sure I’m understanding what you’re asking here.

The problem is that AnonymousUser is not a User, nor is it an instance of Account.

It cannot be used as a replacement for a User (or Account) under any circumstance as an object reference defined as a foreign key to those objects.

1 Like

I mean within this part of method in context_processor it say if user is_Anonymus and return the Variable order_items_count with False, and in html template there is an if statement if this variable is false ignore it.
as i understand it must be use this code and out. it will not go to the second part for getting the order and associate account for it.,

What does your TEMPLATES setting look like?

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',
                'django.contrib.messages.context_processors.messages',
                'Products.context_processors.catalogs',
                'Baskets.context_processors.BasketItemsCount',
            ],
        },
    },
]

What is the traceback you’re getting in this situation?

1 Like

TrackBack:

Traceback (most recent call last):
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/response.py", line 92, in rendered_content
    return template.render(context, self._request)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/backends/django.py", line 62, in render
    return self.template.render(context)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/django/template/base.py", line 173, in render
    with context.bind_template(self):
  File "/usr/lib/python3.10/contextlib.py", line 135, in __enter__
    return next(self.gen)
  File "/home/amw/AMW Park/01 Web Dev/Dev_Park/Django/AStore/venv/lib/python3.10/site-packages/debug_toolbar/panels/templates/panel.py", line 47, in _request_context_bind_template
    updates.update(context)

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

There’s something in your template trying to iterate over a null object. You’ll need to look at your complete template, including any base templates that might be extended or included in this process.

I see where you have DDT installed, there may be one of the template panels that provide more detail - this traceback doesn’t go deep enough into the stack to point to any particular element.

1 Like

thanks Ken i will dig deeper.