在我的项目中,用户拥有他们所关注的许多用户。当他们查看关注他们的用户列表时,我想显示一个关注/取消关注链接,具体取决于他们是否在他们的以下列表中有该人。例如,如果B跟随A,A跟随B,那么当A查看其下列列表时,B名称旁边应该有一个取消关注链接。
不幸的是,它总是说“(跟随)”并且从未给我“(删除)”链接,即使我已经以已经关注该用户的用户身份登录。
我的userprofile模型:
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='user_object')
visible = models.BooleanField(default=True)
bio = models.TextField(null=True, blank=True)
avatar = models.FileField(upload_to=get_upload_file_name, null=True, blank=True)
following = models.ManyToManyField(User, related_name='following_list')
以及我尝试在我的模板中使用的代码:
{% for f in followers %}
<a href="/accounts/profile/{{f.user.id}}/">{{f.user.username}}</a>
{% if thisuser.user_object.following.all == f.user %}
<a href="/accounts/profile/{{f.user.id}}/unfollow/">(Remove)</a>
{% else %}
<a href="/accounts/profile/{{f.user.id}}/follow/">(Follow)</a>
{% endif %}
{% endfor %}
在我的观点中,我发送:
def followers(request, user_id=1):
thisuser = request.user
userlookup = User.objects.get(id=user_id)
following = thisuser
followers = UserProfile.objects.filter(following=thisuser)
args = {'following': following, 'thisuser': thisuser, 'userlookup': userlookup, 'followers': followers}
args.update(csrf(request))
return render_to_response('followers.html', args)
答案 0 :(得分:1)
在视图中装饰您的对象,让您的模板生活更轻松:
from django.shortcuts import render
def followers(request, user_id=1):
user = User.objects.get(pk=user_id)
followers = UserProfile.objects.filter(following=request.user)
args = {}
args['following'] = request.user
args['userlookup'] = User.objects.get(pk=user_id)
args['followers'] = []
for f in followers:
user_status = (f, request.user.user_object.following_list.filter(pk=f.pk).exists())
args['followers'].append(user_status)
return render(request, 'followers.html', args)
关键部分是:
(f, request.user.user_object.following_list.filter(pk=f.pk).exists())
这是一个2元组,第一个项目是用户个人资料对象,如果正在关注此用户,则第二个项目为True或False。如果查询返回结果,则exists()
queryset方法返回True。我用它来标记每个用户对象。
然后我在列表中收集用户配置文件对象的“装饰”列表,该列表作为上下文变量 followers 发送到模板。
您应避免在模板中执行复杂的逻辑,并尽可能使用视图发送有关对象的额外信息。这不仅增强了应用程序的性能(模板不适合繁重的处理,也是最难调试的部分);同时也保证您的模板不受任何逻辑的限制 - 超出显示内容所需的范围。
现在,在您的模板中:
{% for f,following in followers %}
<a href="/accounts/profile/{{f.user.id}}/">{{f.user.username}}</a>
{% if following %}
<a href="/accounts/profile/{{f.user.id}}/unfollow/">(Remove)</a>
{% else %}
<a href="/accounts/profile/{{f.user.id}}/follow/">(Follow)</a>
{% endif %}
{% endfor %}
您无需将request.user
传递给模板,而是确保在您的设置中启用request context processor:
import django.conf.global_settings as DEFAULT_SETTINGS
TEMPLATE_CONTEXT_PROCESSORS += DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS+(
'django.core.context_processors.request',
)