Почему я получаю QuerySet объект не имеет атрибута пользователя - PullRequest
0 голосов
/ 09 марта 2020

Я работаю над сайтом, используя Django, где пользователи могут отправить запрос о дружбе другому пользователю, и я обнаружил ошибку в своем коде. Объект Queryset не имеет атрибута user. Согласно моим прикрепленным изображениям, когда я нажимаю кнопку «Follow» первого пользователя, все кнопки изменяют текст на «Cancel», но когда я нажимаю на кнопку второго пользователя, он не меняет текст. Я хочу, чтобы при нажатии кнопки текст кнопки мог меняться для каждого пользователя.

enter image description here enter image description here enter image description here enter image description here

def home(request):
    p = Profile.objects.exclude(user=request.user)
    u = p.user
    sent_request = FriendRequest.objects.filter(from_user=p.user)
    button_status = 'none'
    if p not in request.user.profile.friends.all()
        button_status = 'not_friend'
        if len(FriendRequest.objects.filter(from_uset=request.user).filter(to_user=p.user)) == 1:
            button_status='add_request'
        if len(FriendRequest.objects.filter(from_user=p.user).filter(to_user=request.user)) == 1:
            button_status='cancel_request'

context = {'u':u, 'p':p, 'sent_request',:sent_request, 'button_status':button_status,} 

return render(request, 'home.html', context) 


{% for profile in p %} 
{{ profile }} 
{% if not request.user in u %} 
{% if button_status == 'not_friend' %} 
href = add url here 
{% elif button_staus == 'cancel_request' %} 
href = cancel request url here
{%  endif %} 
{% endif %}
{% endfor %} 


#This only execute once on template, instead of twice (duplicate). How do I make this display twice in template? 
{% for data in profile_and_button_status %}
{%  data.0.user.username %}
#All codes here
{% endfor %}

{% if forloop.counter == 1 %} 
{% for data in profile_and_button_status %}
#All codes here
{%  data.0.user.username %}
{% endfor %}
{% endif %} 

1 Ответ

1 голос
/ 09 марта 2020

Потому что .exclude() даст вам набор запросов. Итак, вы должны сначала выполнить итерацию этого queryset и получить оттуда требуемого пользователя.

Поскольку queryset это означает list.

Я думаю, что вам нужно передать zip списка профилей p и списка статусов кнопок button_status определенного пользователя, как показано ниже ...

def home(request):
    p = Profile.objects.exclude(user=request.user)
    all_profile_users = []
    button_status_list = []                

    for user_obj in p:

        u = user_obj.user
        all_profile_users.append(u)
        sent_request = FriendRequest.objects.filter(from_user=u)

        friends = Profile.objects.filter(user=request.user, friends__id=user_obj.id).exist()


        button_status = 'none'
        if not friends
            button_status = 'not_friend'
            if len(FriendRequest.objects.filter(from_uset=request.user).filter(to_user=p.user)) == 1:
                button_status='add_request'
            if len(FriendRequest.objects.filter(from_user=p.user).filter(to_user=request.user)) == 1:
                button_status='accept_request'

        button_status_list.append(button_status)

    context = {'u':all_profile_users, 'profile_and_button_status': zip(p, button_status_list), 'sent_request':sent_request}

Затем повторите итерацию profile_and_button_status в шаблоне, как показано ниже ...

{% for data in profile_and_button_status %}

    <div class="row mb-2">
        ... YOUR DESIGN CODE ...
        {{ data.0.user.username }}

   {% if not request.user in u %} 

       {% if data.1 == 'not_friend' %}
            ... YOUR DESIGN CODE ...

       {% elif data.1 == 'follow_request_sent' %}  
            ... YOUR DESIGN CODE ...

И так далее для других условий.

Для удаления друга:

def remove_friend(request, id):
    ... YOUR LOGIC ...
    frequest = FriendRequest.objects.filter(from_user=from_user, to_user=request.user).first()
    if frequest is None:
        frequest = FriendRequest.objects.filter(from_user=request.user, to_user=from_user).first()
    user1 = frequest.to_user
    user2 = from_user
    ... YOUR LOGIC ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...