我正在尝试添加一个按钮来向另一个用户发送好友请求,但我一直得到错误(没有用户匹配给定的查询)。我在用户的profile.html页面上有一个“Add Friends”按钮,该按钮工作正常,我不知道出了什么问题,但是在users_list.html页面上,该按钮返回时出现了这个错误。我对姜戈还是个新手,我也在学习,所以我很感激你的帮助。
错误:找不到页(404)请求方法:获取请求URL:http://127.0.0.1:8000/users/friend-request/send/2/Rised by:users.views.send_friend_request没有与给定查询匹配的用户
views.py
from django.shortcuts import render, redirect, get_object_or_404
from .models import Profile
from feed.models import Post
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth import get_user_model
from django.conf import settings
from django.http import HttpResponseRedirect
from .models import Profile, FriendRequest
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm
import random
from django.core.mail import send_mail
@login_required
def users_list(request):
users = Profile.objects.exclude(user=request.user)
sent_friend_requests = FriendRequest.objects.filter(from_user=request.user)
sent_to = []
friends = []
for user in users:
friend = user.friends.all()
for f in friend:
if f in friends:
friend = friend.exclude(user=f.user)
friends+=friend
my_friends = request.user.profile.friends.all()
for i in my_friends:
if i in friends:
friends.remove(i)
if request.user.profile in friends:
friends.remove(request.user.profile)
random_list = random.sample(list(users), min(len(list(users)), 10))
for r in random_list:
if r in friends:
random_list.remove(r)
friends+=random_list
for i in my_friends:
if i in friends:
friends.remove(i)
for se in sent_friend_requests:
sent_to.append(se.to_user)
context = {
'users': friends,
'sent': sent_to
}
return render(request, "users/users_list.html", context)
def friend_list(request):
p = request.user.profile
friends = p.friends.all()
context={
'friends': friends
}
return render(request, "users/friend_list.html", context)
@login_required
def send_friend_request(request, id):
user = get_object_or_404(User, id=id)
frequest, created = FriendRequest.objects.get_or_create(
from_user=request.user,
to_user=user)
return HttpResponseRedirect('/users/{}'.format(user.profile.slug))
@login_required
def cancel_friend_request(request, id):
user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(
from_user=request.user,
to_user=user).first()
frequest.delete()
return HttpResponseRedirect('/users/{}'.format(user.profile.slug))
@login_required
def accept_friend_request(request, id):
from_user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(from_user=from_user, to_user=request.user).first()
user1 = frequest.to_user
user2 = from_user
user1.profile.friends.add(user2.profile)
user2.profile.friends.add(user1.profile)
if(FriendRequest.objects.filter(from_user=request.user, to_user=from_user).first()):
request_rev = FriendRequest.objects.filter(from_user=request.user, to_user=from_user).first()
request_rev.delete()
frequest.delete()
return HttpResponseRedirect('/users/{}'.format(request.user.profile.slug))
@login_required
def delete_friend_request(request, id):
from_user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(from_user=from_user, to_user=request.user).first()
frequest.delete()
return HttpResponseRedirect('/users/{}'.format(request.user.profile.slug))
def delete_friend(request, id):
user_profile = request.user.profile
friend_profile = get_object_or_404(Profile, id=id)
user_profile.friends.remove(friend_profile)
friend_profile.friends.remove(user_profile)
return HttpResponseRedirect('/users/{}'.format(friend_profile.slug))
@login_required
def profile_view(request, slug):
p = Profile.objects.filter(slug=slug).first()
u = p.user
sent_friend_requests = FriendRequest.objects.filter(from_user=p.user)
rec_friend_requests = FriendRequest.objects.filter(to_user=p.user)
user_posts = Post.objects.filter(user_name=u)
friends = p.friends.all()
# is this user our friend
button_status = 'none'
if p not in request.user.profile.friends.all():
button_status = 'not_friend'
# if we have sent him a friend request
if len(FriendRequest.objects.filter(
from_user=request.user).filter(to_user=p.user)) == 1:
button_status = 'friend_request_sent'
# if we have received a friend request
if len(FriendRequest.objects.filter(
from_user=p.user).filter(to_user=request.user)) == 1:
button_status = 'friend_request_received'
context = {
'u': u,
'button_status': button_status,
'friends_list': friends,
'sent_friend_requests': sent_friend_requests,
'rec_friend_requests': rec_friend_requests,
'post_count': user_posts.count
}
return render(request, 'users/profile.html', context)
@login_required
def edit_profile(request):
if request.method == 'POST':
u_form = UserUpdateForm(request.POST, instance=request.user)
p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('my_profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context ={
'u_form': u_form,
'p_form': p_form,
}
return render(request, 'users/edit_profile.html', context)
@login_required
def my_profile(request):
p = request.user.profile
you = p.user
sent_friend_requests = FriendRequest.objects.filter(from_user=you)
rec_friend_requests = FriendRequest.objects.filter(to_user=you)
user_posts = Post.objects.filter(user_name=you)
friends = p.friends.all()
# is this user our friend
button_status = 'none'
if p not in request.user.profile.friends.all():
button_status = 'not_friend'
# if we have sent him a friend request
if len(FriendRequest.objects.filter(
from_user=request.user).filter(to_user=you)) == 1:
button_status = 'friend_request_sent'
if len(FriendRequest.objects.filter(
from_user=p.user).filter(to_user=request.user)) == 1:
button_status = 'friend_request_received'
context = {
'u': you,
'button_status': button_status,
'friends_list': friends,
'sent_friend_requests': sent_friend_requests,
'rec_friend_requests': rec_friend_requests,
'post_count': user_posts.count
}
return render(request, 'users/profile.html', context)
**urls.py**
from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path, include
from users import views as user_views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('feed.urls')),
path('users/', user_views.users_list, name='users_list'),
path('users/<slug>/', user_views.profile_view, name='profile_view'),
path('friends/', user_views.friend_list, name='friend_list'),
path('users/friend-request/send/<int:id>/', user_views.send_friend_request, name='send_friend_request'),
path('users/friend-request/cancel/<int:id>/', user_views.cancel_friend_request, name='cancel_friend_request'),
path('users/friend-request/accept/<int:id>/', user_views.accept_friend_request, name='accept_friend_request'),
path('users/friend-request/delete/<int:id>/', user_views.delete_friend_request, name='delete_friend_request'),
path('users/friend/delete/<int:id>/', user_views.delete_friend, name='delete_friend'),
path('edit-profile/', user_views.edit_profile, name='edit_profile'),
path('my-profile/', user_views.my_profile, name='my_profile'),
path('search_users/', user_views.search_users, name='search_users'),
path('register/', user_views.register, name='register'),
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name='password_reset'),
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name='password_reset_done'),
path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name='password_reset_confirm'),
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name='password_reset_complete'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
**users_list.html**
{% extends "feed/layout.html" %} {% load static %} {% block cssfiles %}
{% endblock cssfiles %} {% 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-4" type="submit">
Search
</button>
</form>
{% endblock searchform %} {% block content %}
<div class="container">
<div class="row">
<div class="col-md-8">
{% if users %}
<div class="card card-signin my-5">
<div class="card-body">
{% for user_p in users %}
<a href="{{ user_p.get_absolute_url }}"
><img
src="{{ user_p.image.url }}"
class="rounded mr-2"
width="40"
height="40"
alt=""
/></a>
<a class="text-dark" href="{{ user_p.get_absolute_url }}"
><b>{{ user_p }}</b></a
>
{% if not user_p.user in sent %}
<small class="float-right">
<a
class="btn btn-primary mr-2"
href="{% url 'send_friend_request' user_p.id %}"
>Add Friend</a
>
</small>
{% else %}
<small class="float-right">
<a
class="btn btn-warning mr-2"
href="{% url 'cancel_friend_request' user_p.id %}"
>Cancel Request</a
>
</small>
{% endif %}
<br /><br />
{% endfor %}
</div>
</div>
{% else %}
<h5><i>No new people to add now! Please come back later!</i></h5>
{% 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 %} {% block jsfiles %}{% endblock jsfiles %}
</div>
**profile.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-4" type="submit">
Search
</button>
</form>
{% endblock searchform %} {% block content %}
<div class="main-content">
<div class="container mt-7">
<div class="row">
<div class="col-xl-8 m-auto order-xl-2 mb-5 mb-xl-0">
<div class="card card-profile shadow">
<div class="row justify-content-center">
<div class="col-lg-3 order-lg-2">
<div class="card-profile-image">
<a href="{{ u.profile.image.url }}">
<img
src="{{ u.profile.image.url }}"
class="rounded-circle"
width="160px"
height="160px"
/>
</a>
</div>
</div>
</div>
<div
class="card-header text-center border-0 pt-8 pt-md-4 pb-0 pb-md-4"
></div>
<div class="card-body pt-0 pt-md-4">
<div class="row">
<div class="col">
<div
class="card-profile-stats d-flex justify-content-center mt-md-5"
>
<div>
<span class="heading">{{ u.profile.friends.count }}</span>
{% if request.user == u %}
<span class="description"
><a href="{% url 'friend_list' %}">Friends</a></span
>
{% else %}
<span class="description">Friends</span>
{% endif %}
<span class="heading">{{ post_count }}</span>
<span class="description"
><a href="{% url 'user-posts' u.username %}"
>Posts</a
></span
>
</div>
</div>
</div>
</div>
<div class="text-center">
<h3>{{ u }}</h3>
<p>{{ u.profile.bio }}</p>
<hr class="my-2" />
{% if request.user == u %}
<a class="btn btn-info" href="{% url 'edit_profile' %}"
>Edit Profile</a
>
{% else %} {% if button_status == 'not_friend' %}
<small
><a
class="btn btn-primary"
href="/users/friend-request/send/{{ u.id }}"
>Add Friend</a
></small
>
{% elif button_status == 'friend_request_sent' %}
<small
><a
class="btn btn-warning"
href="/users/friend-request/cancel/{{ u.id }}"
>Cancel Request</a
></small
>
{% elif button_status == 'friend_request_received' %}
<small
><a
class="btn btn-success mr-2"
href="/users/friend-request/accept/{{ u.id }}"
>Accept Request</a
></small
>
<small
><a
class="btn btn-danger"
href="/users/friend-request/delete/{{ u.id }}"
>Reject Request</a
></small
>
{% else %}
<small
><a
class="btn btn-danger"
href="/users/friend/delete/{{ u.id }}"
>UnFriend</a
></small
>
{% endif %} {% endif %}
</div>
</div>
</div>
</div>
</div>
<br />
{% if request.user == u %}
<div class="row">
<div class="col-md-6">
<div class="card card-signin my-5">
<div class="card-body">
<h2>Friend Requests Sent ({{ sent_friend_requests.count }})</h2>
<hr class="my-2" />
{% if not sent_friend_requests %}
<h5><i>No sent requests!</i></h5>
{% else %} {% for s_request in sent_friend_requests %}
<a href="{{ s_request.to_user.profile.get_absolute_url }}"
><img
src="{{ s_request.to_user.profile.image.url }}"
class="rounded mr-2"
width="40"
height="40"
alt=""
/></a>
<a href="{{ s_request.to_user.profile.get_absolute_url }}"
><b>{{ s_request.to_user.username }}</b></a
>
<small class="float-right">
<a
class="btn btn-warning mr-2"
href="{% url 'cancel_friend_request' s_request.to_user.id %}"
>Cancel</a
>
</small>
<br /><br />
{% endfor %} {% endif %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="card card-signin my-5">
<div class="card-body">
<h2>Friend Requests Recieved ({{ rec_friend_requests.count }})</h2>
<hr class="my-2" />
{% if not rec_friend_requests %}
<h5><i>No recieved requests!</i></h5>
{% else %} {% for r_request in rec_friend_requests %}
<a href="{{ r_request.from_user.profile.get_absolute_url }}"
><img
src="{{ r_request.from_user.profile.image.url }}"
class="rounded mr-2"
width="40"
height="40"
alt=""
/></a>
<a
class="mr-2 align-middle"
href="{{ r_request.from_user.profile.get_absolute_url }}"
><b>{{ r_request.from_user.username }}</b>
</a>
<small class="float-right">
<a
class="btn btn-success mr-2"
href="/users/friend-request/accept/{{ r_request.from_user.id }}"
>Accept</a
>
<a
class="btn btn-danger"
href="/users/friend-request/delete/{{ r_request.from_user.id }}"
>Reject</a
>
</small>
<br /><br />
{% endfor %} {% endif %}
</div>
</div>
</div>
</div>
{% endif %}
</div>
</div>
{% endblock content %}
问题是您试图使用