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

Вернуться на верх