繁体   English   中英

如何在搜索用户中过滤掉用户的朋友 function Django

[英]How to filter out Friends of user in search users function Django

我正在尝试从“search_users”function 中过滤掉用户的朋友以及当前登录的用户,我尝试使用 exclude(),但不断收到错误,我不确定出了什么问题。 我还想在用户旁边添加一个“添加朋友”按钮,我认为我在“search_users.html”上做得正确。 错误

视图.py

@login_required
def search_users(request):
    query = request.GET.get('q')
    object_list = User.objects.filter(username__icontains=query).exclude(friends=request.user.profile.friends.all())
    context ={ 
        'users': object_list
    }
    return render(request, "users/search_users.html", context)

search_users.html

{% extends "feed/layout.html" %} {% load static %}
{% block searchform %}
<form
  class="form-inline my-2 my-lg-0 ml-5"
  action="{% url 'search_users' %}"
  method="get"
>
  <input name="q" type="text" placeholder="Search users.." />
  <button class="btn btn-success my-2 my-sm-0 ml-10" type="submit">
    Search
  </button>
</form>
{% endblock searchform %} {% block content %}
<div class="container">
  <div class="row">
    <div class="col-md-8">
      {% if not users %}
      <br /><br />
      <h2><i>No such users found!</i></h2>
      {% else %}
      <div class="card card-signin my-5">
        <div class="card-body">
          {% for user_p in users %}
          
          <a href="{{ user_p.profile.get_absolute_url }}"
            ><img
              src="{{ user_p.profile.image.url }}"
              class="rounded mr-2"
              width="40"
              height="40"
              alt=""
          /></a>  
          <a class="text-dark" href="{{ user_p.profile.get_absolute_url }}"
            ><b>{{ user_p }}</b></a
            >  
            
            <small class="float-right">
              <a
                class="btn btn-primary mr-2"
                href="/users/friend-request/send/{{ user_p.username }}"
                >Add Friend</a>
              </small>
          
          <br/><br />

          {% endfor %}
        </div>
      </div>
      {% endif %}
    </div>

    <div class="col-md-4">
      <div class="card card-signin my-5">
        <a href="{{ request.user.profile.get_absolute_url }}"
          ><img
            class="card-img-top"
            src="{{ request.user.profile.image.url }}"
            alt=""
        /></a>
        <div class="card-body">
          <h5 class="card-title text-center">{{ request.user }}</h5>
          <h6 class="text-center">
            {{ request.user.profile.friends.count }}
            <p class="text-muted">Friends</p>
          </h6>
          <p class="card-text text-center">{{ request.user.profile.bio }}</p>
        </div>
      </div>
    </div>
  </div>
  {% endblock content %}
</div>

模型.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.png', upload_to='profile_pics')
    slug = AutoSlugField(populate_from='user')
    bio = models.CharField(max_length=255, blank=True)
    friends = models.ManyToManyField('Profile', blank=True)

它应该是

User.profile.objects.filter(username__icontains=query).exclude(friends=request.user.profile.friends.all())

您之前遇到了错误,因为您之前引用了用户 object 而不是配置文件本身。 User.profile提供一对一相关的 model 配置文件。

您可以在此处阅读有关一对一关系的更多信息。 https://docs.djangoproject.com/en/3.1/topics/db/examples/one_to_one/

我会这样做:

object_list = User.objects\
    .filter(username__icontains=query)\
    .exclude(profile__friends__in=request.user.profile.friends.all())\
    .exclude(id=request.user.id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM