Aaron Cloud
Aaron Cloud

Reputation: 315

NoReverseMatch Error Django Can someone explain how these URL's are failing?

Can someone explain to me how these urls work in django? I'm trying to create a follow/unfollow feature for a twitter clone, the follow is working but when I use the unfollow I am getting the following error. Can someone explain to me why this is failing? I am still learning django and would like to know why this isn't working.

NoReverseMatch at /u/fake_account/unfollow/ Reverse for 'foxyprofile' with keyword arguments '{'usersname': 'fake_account'}' not found. 1 pattern(s) tried: ['u/(?P[^/]+)/$']

Here is my code let me know if you need more.

foxyprofile.html

{% extends 'core/base.html' %} {% load humanize %} {% block content %}
<div class="container">
  <div class="columns">
    <div class="column is-12">
      <h1 class="title">{{ user.username }}</h1>
      <p><a href="{% url 'followers' user.username %}"> Followers: {{ user.foxyprofile.followed_by.count }}</p></a>
      <p><a href="{% url 'following' user.username %}"> Follows {{ user.foxyprofile.follows.count }}</p></a>
      <hr />
      {% if user != request.user %} 
        {% if request.user.foxyprofile in user.foxyprofile.followed_by.all %}
            <a href="{% url 'unfollow_foxy' username=user.username %}" class="button is-danger">Unfollow {{ user.username}}</a>
        {% else %}
            <a href="{% url 'follow_foxy' user.username %}" class="button is-success">Follow {{ user.username}}</a>
        {% endif %} 
      {% endif %}
    </div>
  </div>
  <div class="columns">
    <div class="column is-8">
      <div class="wrapper-fox">
        {% for fox in user.foxs.all %}
        <div class="fox">
          <p class="name">{{ fox.created_by.username }}</p>
          <p>{{ fox.body }}</p>
          <p class="info">{{ fox.created_at|naturaltime}}</p>
          <hr />
          {% endfor %}
        </div>
      </div>
    </div>
  </div>
</div>
{% endblock %}

Views.py

from django.shortcuts import redirect, render, get_object_or_404
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
# Create your views here.


def foxyprofile(request, username):
    user = get_object_or_404(User, username=username)

    context = {
        'user': user
    }
    return render(request, 'foxyprofile/foxyprofile.html', context)


@login_required
def follow_foxy(request, username):
    user = get_object_or_404(User, username=username)

    request.user.foxyprofile.follows.add(user.foxyprofile)

    return redirect('foxyprofile', username=username)


@login_required
def unfollow_foxy(request, username):
    user = get_object_or_404(User, username=username)

    request.user.foxyprofile.follows.remove(user.foxyprofile)

    return redirect('foxyprofile', usersname=username)



def followers(request, username):
    user = get_object_or_404(User, username=username)

    return render(request, 'foxyprofile/followers.html', {'user': user})

def following(request, username):
    user = get_object_or_404(User, username=username)

    return render(request, 'foxyprofile/following.html', {'user': user})

urls.py

from apps.feed.views import feed, search
from apps.feed.api import api_add_fox
from django.urls import path, include
from apps.foxyprofile.views import foxyprofile, follow_foxy, unfollow_foxy, unfollow_foxy_tiny, follow_foxy_tiny, followers, following
from . import views
from django.contrib.auth import views as v

urlpatterns = [
    path('', views.homepage, name='homepage'),
    path('signup/', views.signup, name='signup'),
    path('logout/', v.LogoutView.as_view(), name='logout'),
    path('login/', v.LoginView.as_view(template_name='core/login.html'), name="login"),
    path('feed/', feed, name='feed'),
    path('api/add_fox/', api_add_fox, name='api_add_fox'),
    path('search/', search, name='search'),
    path('u/<str:username>/', foxyprofile, name='foxyprofile'),
    path('u/<str:username>/follow/', follow_foxy, name='follow_foxy'),
    path('u/<str:username>/unfollow/', unfollow_foxy, name='unfollow_foxy'),
    path('u/<str:username>/followers/', followers, name='followers'),
    path('u/<str:username>/following/', following, name='following'),
]

Upvotes: 0

Views: 59

Answers (2)

Harshit Gupta
Harshit Gupta

Reputation: 56

You should try this in views.py in unfollow_foxy

from django.urls import reverse

# your code

return redirect(reverse('foxyprofile'), usersname=username)

Upvotes: 1

Mohamed Hamza
Mohamed Hamza

Reputation: 985

I think the error from this line in html file:

<a href="{% url 'unfollow_foxy' username=user.username %}" class="button is-danger">Unfollow {{ user.username}}</a>

Try to change it to:

<a href="{% url 'unfollow_foxy' user.username %}" class="button is-danger">Unfollow {{ user.username}}</a>

Upvotes: 1

Related Questions