【发布时间】:2020-09-01 23:52:03
【问题描述】:
我一直在尝试添加朋友系统,用户可以在其中添加和删除朋友(其他用户),在完成代码后,我发现当登录用户尝试从其他用户的个人资料中添加朋友时出现错误,添加朋友按钮重定向到登录的用户配置文件,使其无法添加新朋友,它可以将自己添加为朋友。我个人认为错误出在 views.py 个人资料视图上。
views.py(profile 显示用户的个人资料,change_friend 是添加和删除朋友的那个)
def profile(request, username=None):
friend = Friend.objects.filter(current_user=request.user).first()
friends = []
if friend:
friends = friend.users.all()
if username:
post_owner = get_object_or_404(User, username=username)
user_posts=Post.objects.filter(user_id=post_owner)
else:
post_owner = request.user
user_posts=Post.objects.filter(user=request.user)
args1 = {
'post_owner': post_owner,
'user_posts': user_posts,
'friends': friends,
}
return render(request, 'profile.html', args1)
def change_friends(request, operation, pk):
friend = User.objects.get(pk=pk)
if operation == 'add':
Friend.make_friend(request.user, friend)
elif operation == 'remove':
Friend.lose_friend(request.user, friend)
return redirect('profile')
模型.py
class Friend(models.Model):
users = models.ManyToManyField(User, default='users', blank=True, related_name='users')
current_user = models.ForeignKey(User, related_name='owner', on_delete=models.CASCADE, null=True)
@classmethod
def make_friend(cls, current_user, new_friend):
friend, created = cls.objects.get_or_create(
current_user=current_user
)
friend.users.add(new_friend)
@classmethod
def lose_friend(cls, current_user, new_friend):
friend, created = cls.objects.get_or_create(
current_user=current_user
)
friend.users.remove(new_friend)
profile.html
<div class="media">
<div class="media-body">
<h2 class="account-heading">{{ post_owner.username }}</h2>
<p class="text-secondary">{{ post_owner.email }}</p>
{% if not user in friends %}
<a href="{% url 'change_friends' operation='add' pk=user.pk %}">
<button type="button">add Friend</button>
</a>
{% endif %}
</div>
</div>
<div>
<h2>Friends</h2>
{% for friend in friends %}
<p>{{ friend.username }}</p>
<a href="{% url 'change_friends' operation='remove' pk=friend.pk %}">
<button type="button">Remove Friend</button>
</a>
{% endfor %}
</div>
urls.py
urlpatterns = [
path('profile/<str:username>/', views.profile, name='profile_pk'),
url(r'^connect/(?P<operation>.+)/(?P<pk>\d+)/$', views.change_friends, name='change_friends'),
]
【问题讨论】:
-
我对 html 部分有点困惑。你想实现“post_owner(技术上与request.user相同)想将其他用户添加为好友”这个问题吗?如果是这样,您需要在模板中提供“其他用户”以循环并为每个用户生成“添加朋友”按钮。
-
@DenizKaplan 如何在模板中提供“其他用户”以循环生成“添加好友”?
-
如果没有限制,只需将friends_to_add 传递给您的模板,这是
User.objects.exclude(id=request.user.id)的结果。如果您还想从查询集中删除用户的朋友,只需链接.exclude(id__in=friend.users.values_list("id"))如果这很复杂。我可以用详细视图和 html 代码在答案中解释。我在 cmets 中有字符限制。 -
@DenizKaplan 是的,这对我来说看起来有点复杂,请您添加一个答案以便我能更好地理解吗?
标签: python html django django-models django-views