Как получить count и show в шаблоне - Django
Мне удалось получить общих друзей от каждого пользователя и отобразить изображение каждого общего друга в моем шаблоне, как показано на прикрепленном изображении к этому вопросу. Проблема в том, что я не смог получить количество, например, count и length не работают в шаблоне. Как я могу это сделать?
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
