pythondjango

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


Solution

  • 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>
        {% elif post.poster_profile_id in my_pending_friend_requests %}
            <button>Pending</button>
        {% elif post.poster_profile_id in my_reverse_friend_requests %}
            <button>Accept</button>
        {% else %}
            <button>Send Friend Request</button>
        {% endif %}
    
        <div>{{ post.caption }}</div>
    {% endfor %}