我有以下自定义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用户名字段...
不匹配我不清楚何时应该使用get
或dispatch
方法来捕获匿名请求用户并对其进行管理。
或者我可以使用get_context_data
方法管理此匿名请求用户吗?
任何指向正确方向的方向都将受到高度赞赏
最好的问候