Невозможно добавить пост в Django, получая TypeError: 'AnonymousUser' object is not iterable
Когда я нажимаю на модальную кнопку для добавления нового сообщения в Django. Я получаю следующую трассировку
Traceback (most recent call last):
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Django_AJAX_Latest\src\posts\views.py", line 22, in post_list_and_create
author = Profile.objects.get(user = request.user)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\query.py", line 428, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\query.py", line 974, in filter return self._filter_or_exclude(False, args, kwargs)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\query.py", line 992, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, args, kwargs)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\query.py", line 999, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\sql\query.py", line 1375, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\sql\query.py", line 1396, in _add_qn _add_q
child_clause, needed_inner = self.build_filter( n build_filter
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\sql\query.py", line 1302, in build_filter n check_related_objects
self.check_related_objects(join_info.final_field, value, join_info.opts)
File "D:\Django_AJAX_Latest\env\lib\site-packages\django\db\models\sql\query.py", line 1136, iner return func(self._wrapped, *args)n check_related_objects
for v in value:
nctional.py", line 249, in inner return func(self._wrapped, *args)s)
TypeError: 'AnonymousUser' object is not iterable
Ниже приведены мои файлы:
posts/views.py
from django.shortcuts import render
from .models import Post
from django.http import JsonResponse
from .forms import PostForm
from profiles.models import Profile
def is_ajax(request):
return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
def post_list_and_create(request):
form = PostForm(request.POST or None)
if is_ajax(request=request):
if form.is_valid():
author = Profile.objects.get(user = request.user)
instance = form.save(commit=False)
instance.author = author
instance.save()
context = {
'form': form,
}
return render(request, 'posts/main.html', context)
profiles/models.py
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(default=True)
avatar = models.ImageField(default='avatar.jpg', upload_to='avatars')
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Profile of the user {self.user.username}"
posts/models.py
from django.db import models
from django.contrib.auth.models import User
from profiles.models import Profile
# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
liked = models.ManyToManyField(User, blank=True)
author = models.ForeignKey(Profile, on_delete=models.CASCADE)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return str(self.title)
@property
def like_count(self):
return self.liked.all().count()
class Meta:
ordering = ("-created",)
requirements.txt
asgiref==3.4.1
backports.zoneinfo==0.2.1
Django==4.0
django-crispy-forms==1.13.0
Pillow==8.4.0
sqlparse==0.4.2
tzdata==2021.5
Я уже пробовал использовать атрибут request.is_authenticated
, но он выдает другую ошибку AttributeError: 'WSGIRequest' object has no attribute 'is_authenticated'.
Может ли кто-нибудь помочь мне с этим?
Ошибка request.user is an anonymous user означает, что нет ни одного зарегистрированного пользователя,
Попробуйте использовать декоратор login_required, чтобы убедиться, что только зарегистрированные пользователи могут получить доступ к представлению.
from django.contrib.auth.decorators import login_required
@login_required
def post_list_and_create(request):
...
Анонимный пользователь означает, что пользователь не вошел в систему. Вам необходимо зарегистрировать пользователя, прежде чем он получит доступ к любому представлению.
Шаг 1. импортируйте встроенный метод
from django.contrib.auth import login as auth_login
Шаг 2.
Вошел ваш пользователь в просмотр входа
auth_login(request, user)
Примечание.
Используйте этот декоратор над представлениями, кроме Auth, чтобы пользователь не имел доступа ни к одному представлению без регистрации.
@login_required