How to display a friend request button on each post?
I'm trying to make each post from all users have a friend request button for each specific user who uploaded post on homepage. This code below is what I have tried but friend request button is not displayed on each post. I have also tried using a boolean field but still same problem.
What could I have been doing wrong?
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 %}
I tried using a boolen True or False in the FriendRequest Model but still do not solve the problem
I think you could get away with something like this (some variable names may require changing as it's not quite obvious where friends
is coming from)
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)
and then something like
{% 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 %}
Your template looks a bit off, you have
{% for user in poster_profile %}
and right after user is redefined by
{% for user in profile_and_button_status %}
There's also what looks like an inconsistency in your conditions:
# Here it's user.1
{% if user.1 == 'not_friend' %}
........
# Here it's data.1
{% elif data.1 == 'cancel_request_sent' %}
Perhaps you meant to do
{% for data in profile_and_button_status %}
{% if data.1 == 'not_friend' %}
# Your code here
{% elif data.1 == 'cancel_request_sent' %}
and replace user.1 with data.1