【问题标题】:Unable to add post in Django getting TypeError: 'AnonymousUser' object is not iterable无法在 Django 中添加帖子获取 TypeError:'AnonymousUser' 对象不可迭代
【发布时间】:2022-01-26 04:44:32
【问题描述】:

当我单击模态按钮以在 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'。

有人可以帮我解决这个问题吗?

【问题讨论】:

标签: django django-models django-rest-framework django-views django-forms


【解决方案1】:

error request.user is an anonymous user表示没有没有登录用户

尝试使用 login_required 装饰器,以确保只有登录用户才能访问视图

from django.contrib.auth.decorators import login_required

@login_required
def post_list_and_create(request):
...

【讨论】:

    【解决方案2】:

    匿名用户表示该用户未登录。您需要先登录您的用户才能访问任何视图。

    第 1 步。 导入内置方法

    from django.contrib.auth import login as auth_login

    第 2 步。

    在登录视图中登录您的用户

    auth_login(request, user)

    注意 在视图上方使用此装饰器,除了 Auth 用户在没有登录的情况下无法访问任何视图。 @login_required

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2020-02-28
      • 2019-07-25
      • 1970-01-01
      相关资源
      最近更新 更多