我正在做一个Django
博客网站项目。
我的一项功能是登录时,可以单击标签Other members
来显示其他成员的列表;喜欢这张图片
。
但是,到目前为止,仅当我以一个特定帐户(即管理员)身份登录时,此功能才可用。当我以其他成员(不是admin)或另一个admin帐户登录时,该功能无法正常工作;这意味着当我点击标签Other Members
时,它将显示类似错误
"Friend matching query does not exist"
我真的很困惑,被这个困扰。有什么解决方法的想法吗?
这是我的代码:
** list_users.html **
{% extends "blog/base.html" %}
{% block content %}
<div class="container">
<div class="col-sm-6">
<h2>Other People</h2>
{% for user in users %}
<a href="{% url 'view_profile_with_pk' pk=user.pk %}">
<h3>{{ user.username }}</h3>
</a>
{% if not user in friends %}
<a href="{% url 'change_friends' operation='add' pk=user.pk %}">
<button type="button" class="btn btn-success">Add Friend</button>
</a>
{% endif %}
{% endfor %}
</div>
<br>
<div class="col-sm-6">
<h2>Friends</h2>
{% for friend in friends %}
<a href="{% url 'view_profile_with_pk' pk=friend.pk %}">
<h3>{{ friend.username }}</h3>
</a>
<a href="{% url 'change_friends' operation='remove' pk=friend.pk %}">
<button type="button" class="btn btn-default">Remove Friend</button>
</a>
{% endfor %}
</div>
</div>
{% endblock content %}
views.py 功能listusers
def listusers(request):
posts = Post.objects.all().order_by()
users = User.objects.exclude(id=request.user.id)
friend = Friend.objects.get(current_user=request.user)
friends = friend.users.all()
context = {
'posts': posts, 'users': users, 'friends': friends
}
return render(request, 'blog/list_users.html', context)
model.py 类Friend
class Friend(models.Model):
users = models.ManyToManyField(User)
current_user = models.ForeignKey(User, related_name='owner', null=True, on_delete=models.CASCADE)
答案 0 :(得分:1)
这是因为您正在使用get
运算符来获取朋友。如您所提供的图像所示,问题出在视图的第25行。在以下方法中:
friend = Friend.objects.get(current_user=request.user)
您正在尝试获取不存在的商品。没有朋友,它是current_user是请求的用户。
您可以这样解决它:
friend = Friend.objects.filter(current_user=request.user).first()
if friend:
friends = friend.users.all()
else:
friends = User.objects.none()
答案 1 :(得分:1)
尝试使用filter
代替get
。如果没有匹配结果,get
就会引发异常。
看看filter
Friend.objects.filter(current_user=request.user).first()
答案 2 :(得分:1)
另一种方法是,如果用户没有Friend实例,则创建它。您可以为此使用get_or_create。例如:
users = User.objects.exclude(id=request.user.id)
friend, created = Friend.objects.get_or_create(current_user=request.user) # or have other necessary fields for Friend field
friends = friend.users.all()
context = {
'posts': posts, 'users': users, 'friends': friends
}
return render(request, 'blog/list_users.html', context)