显示两个循环在一起并排除1个查询结果的查询集的问题 - DJANGO

时间:2018-06-09 22:28:08

标签: python django django-templates django-rest-framework django-views

我有一个django应用程序,我想创建一个搜索结果页面。在此页面中,我希望用户能够搜索其他用户。从结果来看,如果登录用户是提供结果列表的任何用户的朋友,我希望它显示用户名旁边的朋友。如果搜索结果不是已登录用户的朋友,我希望有一个链接,让他们向其名称旁边显示的用户发送请求。

我目前有朋友查询和结果查询。我将它们传递给模板。在模板中,我遍历搜索结果。然后我嵌套了朋友的查询。然后我检查看3件事。如果登录用户的用户名在用户字段中,如果当前搜索的用户名与当前的恶魔用户名相同,我想显示待处理或好友,具体取决于好友请求是待处理还是已接受。如果搜索结果中的用户名未显示在好友查询中,我希望有一个好友请求链接来发送好友请求。因为朋友模型有两个存储用户的地方,无论是朋友字段中的用户外键还是用户名,我都很难解读这个问题。

这是我的代码:

models.py

class Friend(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    friend = models.CharField(max_length=22)
    requested = models.BooleanField(default=False)
    accepted = models.BooleanField(default=False)
    blocked = models.BooleanField(default=False)
    reference = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now_add=True)

用户是外键,朋友只是一个有用户名的字段,因为它不允许我添加到引用同一个表的外键。

这是view.py文件:

@login_required(login_url='/login/')
def user_search(request):
    user = request.user
    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()
        print(searched)
        friends = Friend.objects.filter(user = user).all()
        friends |= Friend.objects.filter(friend = user.username).all()
        print(friends)
        parameters = {
            'user':user,
            'searched':searched,
            'friends':friends,
        }
        return render(request, 'users/user_search.html', parameters)

这会抓取两个查询。搜索将获取包含搜索短语的所有用户记录。朋友查询根据朋友表中的用户和朋友引用抓取所有登录用户朋友。

这是我嵌套并浏览两个查询集并尝试在好友查询中显示的用户名旁边显示待处理或好友的模板。如果用户名未显示在好友查询集中,我想向该用户显示send_request。

<form method="POST">
  {% csrf_token %}
  <input type="text" name="search" placeholder="Search">
</form>

Results

<!-- {% for search in searched %}
  <p>
    <a href="{% url 'view_profile' username=search.username %}">{{ search.username }}</a>
  </p>
{% endfor %} -->

{% for search in searched %}
  {% if search.username != user.username %}
    <p>
    <a href="{% url 'view_profile' username=search.username %}">{{ search.username }}</a>
    {% if friends %}
      {% for friend in friends %}

        {% if friend.user.username == user.username %}

          {% if friend.friend == search.username %}

            {% if friend.requested == True %}
              pending
            {% endif %}
            {% if friend.accepted == True %}
              friends
            {% endif %}

          {% endif %}

        {% elif friend.friend == user.username %} <!-- end of if friends.user.username == user.username -->

          {% if friend.user.username == search.username %}

            {% if friend.requested == True %}
              pending
            {% endif %}
            {% if friend.accepted == True %}
              friends
            {% endif %}

          {% endif %}

        {% else %}

          <a href="{% url 'send_request' username=search.username %}">Send Request</a>

        {% endif %}

      {% endfor %}
    {% else %}
      <a href="{% url 'send_request' username=search.username %}">Send Request</a>
    {% endif %}
    </p>
  {% endif %}
{% endfor %}

0 个答案:

没有答案