Объект AnonymousUser не является итеративным - доступ к просмотрам анонимных и прошедших проверку пользователей
У меня есть следующие URL:
Главный urls.py
:
url(r'^accounts/profiles/', include('accounts.urls', namespace = 'accounts')),
accounts/urls.py
url(r"^(?P<email>[\w.@+-]+)/$", views.UserDetailView.as_view(), name='detail'),
Я создал UserDetailView для просмотра данных пользователя
User = get_user_model()
class UserDetailView(UserProfileDataMixin, generic.DetailView):
template_name = 'accounts/user_detail.html'
queryset = User.objects.all()
def get_object(self):
return get_object_or_404(
User,
email__iexact=self.kwargs.get("email")
)
def get_context_data(self, *args, **kwargs):
context = super(UserDetailView, self).get_context_data(*args, **kwargs)
user = self.request.user
following = UserProfile.objects.is_following(self.request.user, self.get_object())
context['following'] = following
context['recommended'] = UserProfile.objects.recommended(self.request.user)
return context
Когда я получаю доступ к /accounts/profiles/luisa@gmail.com/
URL, когда пользователь, который выполняет запрос, вошел в систему, запрос в порядке
[08/Sep/2017 23:56:20] "GET /accounts/profiles/luisa@gmail.com/ HTTP/1.1" 200 23577
Но я хочу, чтобы к этому представлению присоединились анонимные пользователи или пользователи, не прошедшие проверку подлинности, которые не регистрируются в моем приложении. Когда анонимный пользователь получает доступ к /accounts/profiles/luisa@gmail.com/
URL Я получаю это сообщение:
TypeError: 'AnonymousUser' object is not iterable
[09/Sep/2017 00:00:50] "GET /accounts/profiles/luisa@gmail.com/ HTTP/1.1" 500 151513
Мой пользовательский метод менеджера is_following()
является:
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
и рекомендуемый метод ():
def recommended(self, user, limit_to=10):
print(user)
profile = user.profile
# my profile
following = profile.following.all()
# profile of the people that I follow
following = profile.get_following()
# TO avoid recommend myself
# Exclude the users recommendations which I already follow
qs = self.get_queryset().exclude(user__in=following).exclude(id=profile.id).order_by("?")[:limit_to]
return qs
Как я могу позволить UserDetailView
быть доступным для анонимных пользователей?
1 ответ
Сначала создайте LoginRequired
учебный класс.
from django.contrib.auth.decorators import login_required
from django.views.generic import View
from django.utils.decorators import method_decorator
class LoginRequired(View):
"""
Redirects to login if user is anonymous
"""
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(LoginRequired, self).dispatch(*args, **kwargs)
А потом:
class UserDetailView(LoginRequired,UserProfileDataMixin, generic.DetailView):