Как отобразить кнопку запроса в друзья в каждом посте?
Я пытаюсь сделать так, чтобы в каждой публикации от всех пользователей была кнопка запроса в друзья для каждого конкретного пользователя, который загрузил публикацию на главную страницу. Приведенный ниже код - это то, что я пробовал, но кнопка запроса в друзья отображается не в каждой публикации. Я также пробовал использовать логическое поле, но проблема все та же.
Что я мог сделать не так?
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True)
friends = models.ManyToManyField('Profile', related_name="my_friends",blank=True)
class Post(models.Model):
poster_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, blank=True,null=True)
caption = models.TextField(blank=True, null=True)
class FriendRequest(models.Model):
from_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='from_user')
to_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='to_user')
def ForYouView(request):
page_title = "For You"
poster_profile = Post.objects.all()
p = Profile.objects.exclude(
Q(user=request.user)).order_by('-id')
all_profile_users = []
button_status_list = []
for user_obj in p:
u = user_obj.user
all_profile_users.append(u)
friends = Profile.objects.filter(user=request.user, friends__id=user_obj.id).exists()
button_status = 'none'
if not friends:
button_status = 'not_friend'
if len(FriendRequest.objects.filter(
from_user=request.user).filter(to_user=u)) == 1:
button_status = 'cancel_request_sent'
if len(FriendRequest.objects.filter(
from_user=u).filter(to_user=request.user)) == 1:
button_status = 'follow_back_request'
button_status_list.append(button_status)
context = {
'page_title': page_title,
'poster_profile': poster_profile,
'profile_and_button_status': zip(p,button_status_list),
'u': all_profile_users,
}
return render(request, 'foryou.html', context)
{% if poster_profile %}
{% for user in poster_profile %}
<div>{{ user.poster_profile }}</div>
{% if not user == request.user %}
{% for user in profile_and_button_status %}
{% if user.1 == 'not_friend' %}
<a href="" class="friend-request">
<button type="button" class="btn">
Follow
</button>
</a>
{% elif user.1 == 'cancel_request_sent' %}
<a href="" class="friend-request">
<button type="button" class="btn">
Cancel
</button>
</a>
{% elif user.1 == 'follow_back_request' %}
<a href="" class="friend-request">
<button type="button" class="btn">
Follow back
</button>
</a>
{% else %}
<a href="" class="friend-request">
<button type="button" class="btn">
Following
</button>
</a>
{% endif %}
{% endfor %}
{% endif %}
<div>{{ user.caption }}</div>
{% endfor %}
{% endif %}
Я пробовал использовать логическое значение True или False в модели запроса друзей, но это все равно не решает проблему
Я думаю, вам могло бы сойти с рук что-то вроде этого (возможно, потребуется изменить имена некоторых переменных, поскольку не совсем очевидно, откуда берется friends)
def ForYouView(request):
my_friend_ids = set(request.user.profile.friends.values_list('id', flat=True))
my_pending_friend_requests = set(
FriendRequest.objects.filter(from_user=request.user).values_list('to_user_id', flat=True)
)
my_reverse_friend_requests = set(
FriendRequest.objects.filter(to_user=request.user).values_list('from_user_id', flat=True)
)
page_title = "For You"
context = {
"page_title": page_title,
"posts": Post.objects.all(),
"my_friend_ids": my_friend_ids,
"my_pending_friend_requests": my_pending_friend_requests,
"my_reverse_friend_requests": my_reverse_friend_requests,
}
return render(request, "foryou.html", context)
, а затем что-то вроде
{% for post in posts %}
<div>{{ post.poster_profile }}</div>
{% if post.poster_profile_id in my_friend_ids %}
<button>Unfriend</button>
{% else if post.poster_profile_id in my_pending_friend_requests %}
<button>Pending</button>
{% else if post.poster_profile_id in my_reverse_friend_requests %}
<button>Accept</button>
{% else %}
<button>Send Friend Request</button>
{% endif %}
<div>{{ post.caption }}</div>
{% endfor %}
Ваш шаблон выглядит немного не так, у вас есть
{% for user in poster_profile %}
и сразу после того, как пользователь будет переопределен на
{% for user in profile_and_button_status %}
В ваших условиях также есть то, что выглядит как несоответствие:
# Here it's user.1
{% if user.1 == 'not_friend' %}
........
# Here it's data.1
{% elif data.1 == 'cancel_request_sent' %}
Возможно, вы хотели сделать
{% for data in profile_and_button_status %}
{% if data.1 == 'not_friend' %}
# Your code here
{% elif data.1 == 'cancel_request_sent' %}
и замените user.1 на data.1