Как мне использовать request.user в шаблоне - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь отобразить другой текст для пользователя в пустом теге. Мне удалось правильно реализовать это в другом шаблоне, но я не совсем понимаю, почему он не отображается правильно в другом шаблоне. Например, если пользователь A входит в систему, я хочу, чтобы только пользователь A видел «Поиск людей для подписки», а другие пользователи - «Нет пользователей».

def following_view(request, username):
    p = FriendRequest.objects.filter(from_user__username=username)
    all_profile_user=[]
    button_status_list=[]

    for user_obj in p:
        u = user_obj.to_user
        all_profile_user.append(u)
        friend = 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'

        button_status_list.append(button_status)
context={'profile_and_button_status':zip(p, button_status_list), 'u':all_profile_user, 'following':p,}


{% for data in profile_and_button_status %}
#Button codes here
{% empty %}
#why this doesn't display
{% if data.user != request.user %}
No users
{% endif %}
{% if data.user == request.user %}
Find people to follow
{% endif %}
{% endfor %}

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

Вы можете попробовать вот так:

{% for friend_request, status in profile_and_button_status %}
#Button codes here

#why this doesn't display
{% if friend_request.to_user != user %}
No users
{% else %}
Find people to follow
{% empty %}
No users
{% endfor %}

Но я бы предложил лучший подход, который заключается в расчете их в представлениях вместо шаблона. Например:

from django.db.models import Case, When, Value, CharField, F

def following_view(request, username):
    friend_requests = FriendRequest.objects.filter(
        from_user__username=username
    ).annotate(
        button_status=Case(
            When(to_user__in=request.user.profile.friends.all(), then=Value('none')),
            When(
                from_user=request.user, to_user=F('to_user'),
                then=Value('cancel_request_sent')
            ),
            default=Value('not_friend'),
            output_field=CharField()
        )
    )
    return render(request, 'template.html',context={'friend_requests':friend_requests})

# template

{% for friend_request in friend_requests %}
    {{ friend_request.button_status }}
    {% empty %}
       No users
{% endfor %}

Я использую conditional expression здесь.

Обновление (на основе комментариев)

Это должно быть просто. Вы должны отправить данные, если request.user.username и username совпадают. Например:

# view

context={'checking_own_friend_list': request.user.username == username,... # rest of the contexts

# template

{% for data in profile_and_button_status %}
    {% empty %}
    {% if checking_own_friend_list %}
    Find people to follow
    {% else %}
    No user
{% endfor %}
0 голосов
/ 01 апреля 2020

Вы используете для l oop вместо оператора if. Это должно быть

{% for data in profile_and_button_status %}
    # Button codes here
    {% empty %}
    # why this doesn't display
    {% if data.user != request.user %}
        No users
    {% endif %}
    {% if data.user == request.user %}
        Find people to follow
    {% endif%}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...