' AnonymousUser' object不可迭代 - 匿名和经过身份验证的用户访问UserDetailView

时间:2018-04-17 00:15:45

标签: django-urls django-class-based-views anonymous django-users

我有以下自定义User模型:

class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(_('username'), max_length=30)
    email = models.EmailField(unique=True, null=True)
    slug = models.SlugField(max_length=100, blank=True)

此外,我还有与其各自Manager()相关的UserProfile模型,以执行跟随用户的一些操作:

class UserProfileManager(models.Manager):
    use_for_related_fields = True

    def is_following(self, user, followed_by_user):
        user_profile, created = UserProfile.objects.get_or_create(user=user)
        if created:
            return False
        if followed_by_user in user_profile.following.all():
            return True
        return False

class UserProfile(models.Model):
    # user.profile
    user = models.OneToOneField(settings.AUTH_USER_MODEL,   on_delete=models.CASCADE, related_name='profile')

    # user.profile.following -- users I follow
    # user.profile.followed_by -- users that follow me -- reverse relationship
    following = models.ManyToManyField(settings.AUTH_USER_MODEL,
        blank=True, related_name='followed_by')

    objects = UserProfileManager()  

    def __str__(self):
        return str(self.user)

然后,我创建了一个User的详细视图,我希望在用户登录时可视化,以及用户匿名的位置。

我有网址:

url(r"^(?P<slug>[\w.@+-]+)/$", views.UserDetailView.as_view(), name='detail'),

UserDetailView如下:

class UserDetailView(generic.DetailView):   
    template_name = 'accounts/user_detail.html'
    queryset = User.objects.all()

    def get_object(self):
        return get_object_or_404(User,                slug__iexact=self.kwargs.get("slug") 
                    )

    def get_context_data(self, **kwargs):
        context = super(UserDetailView, self).get_context_data(**kwargs)
        user = self.request.user
        following = UserProfile.objects.is_following(self.request.user, self.get_object())
        context['following'] = following

        if user.is_authenticated():
            context['userprofile'] = user.profile

        return context

当我访问http://localhost:8000/accounts/profiles/<username>/网址时,当执行请求的用户通过身份验证时, ALL为O.K

[17/Apr/2018 00:01:07] "GET /accounts/profiles/bgarcial/ HTTP/1.1" 200 41394

但是,我想要从匿名用户或未经过身份验证的用户加入此视图,这些用户未在我的应用程序中注册,然后,当匿名用户访问http://localhost:8000/accounts/profiles/<username>/ URL时,我收到此消息:< / p>

TypeError: 'AnonymousUser' object is not iterable
[17/Apr/2018 00:01:57] "GET /accounts/profiles/bgarcial/ HTTP/1.1" 500 147208

不方便的是在is_following()类中创建的自定义管理器方法(UserProfileManager),并在UserDetailView

中调用
File "/home/bgarcial/workspace/hostayni_platform/accounts/views.py", line 89, in get_context_data
    following = UserProfile.objects.is_following(self.request.user, self.get_object())
  File "/home/bgarcial/workspace/hostayni_platform/accounts/models.py", line 572, in is_following
    user_profile, created = UserProfile.objects.get_or_create(user=user)
  File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/db/models/query.py", line 473, in get_or_create

我尝试使用dispatch cbv中的UserDetailView函数来自匿名用户来管理请求:

def dispatch(self, request, slug, *args, **kwargs):
    if request.user.is_anonymous():
        username = User.objects.filter(slug__iexact=slug)
        return HttpResponseRedirect(reverse_lazy("accounts:detail", slug=username))
    else:
        return super(UserDetailView, self).dispatch(request, slug, *args, **kwargs)

但我收到此错误消息

TypeError: reverse() got an unexpected keyword argument 'slug'
[17/Apr/2018 00:07:43] "GET /accounts/profiles/bgarcial/ HTTP/1.1" 500 97476

 return self.dispatch(request, *args, **kwargs)
  File "/home/bgarcial/workspace/hostayni_platform/accounts/views.py", line 68, in dispatch
    return HttpResponseRedirect(reverse_lazy("accounts:detail", slug=username))
  File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/http/response.py", line 417, in __init__

我按dispatch方法更改get方法以获取匿名请求:

def get(self, request, slug, *args, **kwargs):
    if request.user.is_anonymous():
        username = User.objects.filter(slug__iexact=slug)
    return redirect("accounts:detail", slug=username)

我收到NoReverseMatch消息:

django.urls.exceptions.NoReverseMatch: Reverse for 'detail' with arguments '()' and keyword arguments '{'slug': <QuerySet [<User: @bgarcial>]>}' not found. 1 pattern(s) tried: ['accounts/profiles/(?P<slug>[\\w.@+-]+)/$']

请求的网址与预期的模式,slug用户名字段...

不匹配

我不清楚何时应该使用getdispatch方法来捕获匿名请求用户并对其进行管理。

或者我可以使用get_context_data方法管理此匿名请求用户吗?

任何指向正确方向的方向都将受到高度赞赏

最好的问候

0 个答案:

没有答案