«Друг» не имеет атрибута «META» ошибка неизвестная причина - django - PullRequest
0 голосов
/ 10 июня 2018

У меня есть представление и шаблон, которые создают запросы для поиска по объектам в базе данных.У меня также есть списки, которые будут создавать список имен пользователей на основе различных наборов запросов.Я передаю искомый набор запросов и два списка ожидающих и друзей.Затем я проверяю, находятся ли имена пользователей в поисковом запросе в списке.если они в списке, он отобразит другое сообщение в зависимости от списка, в котором он находится. Если он не находится ни в одном списке, он отобразит другое сообщение.

error + trace:

AttributeError at /search/
'Friend' object has no attribute 'META'
Request Method: POST
Request URL:    http://127.0.0.1:8000/search/
Django Version: 2.0.5
Exception Type: AttributeError
Exception Value:    
'Friend' object has no attribute 'META'
Exception Location: /Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/site-packages/django/template/context_processors.py in debug, line 40
Python Executable:  /Users/omarjandali/anaconda3/envs/MySplit/bin/python
Python Version: 3.6.2
Python Path:    
['/Users/omarjandali/Desktop/mysplit/mysplit',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python36.zip',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/lib-dynload',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/site-packages']

вот код:

if request.method == "POST":
        search = request.POST['search']
        searched = User.objects.filter(username__contains = search).all()
        searched |= User.objects.filter(first_name__contains = search).all()
        searched |= User.objects.filter(last_name__contains = search).all()
        requester = Friend.objects.filter(user = user).filter(requested = True).all()
        requested = Friend.objects.filter(friend = user.username).filter(requested = True).all()
        friended = Friend.objects.filter(user = user).filter(accepted = True).all()
        friender = Friend.objects.filter(friend = user.username).filter(accepted = True).all()
        pending = []
        for request in requester:
            pending.append(request.friend)
        for request in requested:
            pending.append(request.user.username)
        print(pending)
        friends = []
        for friend in friended:
            friends.append(friend.friend)
        for friend in friender:
            friends.append(friend.user.username)
        print(friends)
        parameters = {
            'user':user,
            'searched':searched,
            'friends':friends,
            'pending':pending,
        }
        return render(request, 'users/user_search.html', parameters)

Вот шаблон:

{% for search in searched %}
  {% if search.username != user.username %}
    <p>
    <a href="{% url 'view_profile' username=search.username %}">{{ search.username }}</a>
    {% if search.username in pending %}
      Pending
    {% elif search.username in friends %}
      Friends
    {% else %}
      <a href="{% url 'send_request' username=search.username %}">Send Request</a>
    {% endif %}
    </p>
  {% endif %}
{% endfor %}

1 Ответ

0 голосов
/ 10 июня 2018

Цикл for-in, который создает список pending, использует переменную с именем request, которая скрывает внешнюю переменную request.Когда цикл for-in заканчивается, значение request является последним значением из списка (экземпляр Friend).Затем он передается в render, который падает.

Для разрешения используйте имя, отличное от request для переменных цикла - например, req

for req in requester:
    pending.append(req.friend)
for req in requested:
    pending.append(req.user.username)
...