提问者:小点点

Django添加好友请求错误(没有与给定查询匹配的用户)


我正在尝试添加一个按钮来向另一个用户发送好友请求,但我一直得到错误(没有用户匹配给定的查询)。我在用户的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 %} 

共1个答案

匿名用户

问题是您试图使用实例的id来查找实例。在中,设置为查询集。使用将id提供给。更改以根据配置文件ID查找配置文件或用户将起作用。或者,也可以将更改为列表。