Как получить count и show в шаблоне - Django

Мне удалось получить общих друзей от каждого пользователя и отобразить изображение каждого общего друга в моем шаблоне, как показано на прикрепленном изображении к этому вопросу. Проблема в том, что я не смог получить количество, например, count и length не работают в шаблоне. Как я могу это сделать?

enter image description here

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True) 
    profile_pic = models.ImageField(upload_to='UploadedProfilePicture/', default="ProfileAvatar/avatar.png", blank=True)
    following = models.ManyToManyField(
        'Profile',  # Refers to the User model itself
        symmetrical=False,  # If A follows B, B doesn't automatically follow A
        related_name='followers',  # Reverse relationship: get followers of a user
        blank=True,
    )


def FollowingView(request):
    page_title = "Following"

    # All account users
    profile_users = Profile.objects.exclude(
        Q(user=request.user))

    # Mutual Followers
    all_following = request.user.profile.following.values_list('pk', flat=True)
    mutual_followers = Profile.objects.filter(pk__in=all_following)


Template:

{% for users in profile_users %}

# List of users
<p>{% users.user %}</p>

{% for user_following in mutual_followers %}
  {% if user_following in users.following.all %}
  <img src="{{ user_following.user.profile.profile_pic.url }}" class="hover-followers-img"/>

  {{ user_following.count }} # Not getting count

  {% endif %}
  {% endfor %}

{% endfor %}

Проблема сейчас в том, что я не смог получить значение count, например, count и length не работают в шаблоне.

Строго говоря, вы можете заставить .count() или |length работать в шаблоне, но вы не должны, Действительно, Язык шаблонов Django намеренно ограничен, чтобы предотвратить вызов методов с параметрами или подписывание произвольными ключами. Язык шаблонов Jinja предлагает это, и вы можете использовать это вместо этого, но это не тоже хорошая идея.

Причина, по которой это (легко) сделать в шаблоне, заключается в том, что это не относится к шаблону. Шаблоны должны иметь дело с логикой отображения: им предоставляются данные, которые фильтруются, агрегируются и объединяются с помощью представления, и шаблон не должен выполнять какие-либо из следующих действий: это, за исключением форматирования данных, было сделано в привлекательном виде. Здесь используются фильтры шаблонов, это затруднит повторное использование логики где-либо еще (например, если вы хотите использовать два шаблона для одного и того же представления) и будет работать менее эффективно, поскольку движок шаблонов Django далек от эффективно.

from django.db.models import Count, Prefetch, Q


def FollowingView(request):
    page_title = 'Following'

    # All account users
    profile_users = (
        Profile.objects.exclude(Q(user=request.user))
        .annotate(
            nmutual=Count(
                'following', filter=Q(following__followers__user=request.user)
            )
        )
        .prefetch_related(
            Prefetch(
                'following',
                Profile.objects.filter(followers__user=request.user),
                to_attr='mutual_friends',
            )
        )
    )
    return render(request, 'my_template.html', {'profile_users': profile_users})

а затем отобразите это как:

{% for users in profile_users %}
  <p>{% users.user %}</p>

  {% for user_following in user.mutual_freinds %}
    <img src="{{ user_following.user.profile.profile_pic.url }}" class="hover-followers-img"/>
  {% endfor %}
  <b>{{ user.nmutual }}</b> # Not getting count
{% endfor %}
<время работы/>

Примечание: Функции обычно записываются в snake_case, а не в PascalCase, поэтому рекомендуется переименовать вашу функцию в following_view, а не в FollowingView.

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