Отображение всех профилей пользователей в шаблоне Django, понравившихся текущему вошедшему пользователю (в поле ManytoMany)
Я создал портал, на котором пользователи могут видеть профили других пользователей и ставить им лайки. Я хочу показать страницу, на которой зарегистрированные пользователи могут видеть список профилей только тех пользователей, которые им понравились.
У Модели есть файл 'liked', где хранятся лайки каждого профиля пользователя:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
company = models.CharField(max_length=500, blank = True)
city = models.CharField(max_length=100, blank = True)
website = models.URLField(max_length=500, blank = True)
liked = models.ManyToManyField(User, related_name='user_liked', blank=True)
Мой views.py, и здесь я показываю только всех членов, поэтому в моем шаблоне я могу перебирать каждого члена в members... Включая детали 'member.profile' из модели Profile.
@login_required
def all_fav_members(request):
users = User.objects.all
context = {'members':users}
return render(request, 'club/all_fav_members.html', context)
Я перепробовал много вещей, как в файле views.py, так и в моем HTML шаблоне, но я не смог перебрать всех пользователей, связанных с определенным профилем в поле 'liked', где этот пользователь равен request.user.
Я новичок в Django, поэтому пробовал множество способов. В результате обычно я получаю весь список пользователей, а не те, которые понравились текущему пользователю. Один из неработающих примеров:
{% if member.profile.liked.filter(id=request.user.id).exists()%}
Мой шаблон:
{% for member in members %}
<table class="table w-100 table-hover">
<thead>
<tr id="header-paragraph-table-top">
<th>Name & Surname</th>
<th>Email</th>
<th>Company</th>
</tr>
</thead>
<tbody>
<tr id="paragraph-table">
<td>{{ member.first_name|capfirst }} {{ member.last_name|capfirst }}</td>
<td><a href="mailto:{{ member.email }}">{{ member.email }}</a></td>
<td>{{ member.profile.company }}</td>
</tr>
</tbody>
</table>
urls.py
path('all_fav_members/', views.all_fav_members, name='all_fav_members'),
Для решения этой проблемы я бы, вероятно, использовал теги шаблонов. Прочитайте эту страницу, чтобы узнать, как зарегистрировать теги шаблонов: https://docs.djangoproject.com/en/4.0/howto/custom-template-tags/
Внутри your_template_tags:
from django import template
register = template.Library()
@register.filter
def liked_user(user, other_user):
return user.profile.liked.filter(id=other_user.id).exists()
Внутри вашего шаблона вы можете сделать следующее:
{% load your_template_tags %}
{% if member|liked_user:request.user %}
Хотя я бы, вероятно, обработал это в views.py следующим образом:
for member in context["members"]:
member.liked_by_user = member.profile.liked.filter(id=request.user.profile.id).exists()
Тогда вы можете просто использовать это свойство в своем шаблоне, например:
{% if member.liked_by_user %}