Django is giving me NoReverseMatch at /post/5/ error when I deploy while everything works fine locally
Django is giving me NoReverseMatch error for no reason. Everything works fine in my local environment but as soon as I deploy, I get this error. I got this error yesterday also, when I implemented a button for adding posts. At that time, I tried to find the error but couldn't and gave up but today when I opened the page, the error was gone. Now I feel that whenever I implement a new feature, django likes to throw that error at me for no reason and later it gets fixed on its own?? This is driving me crazy please I would really appreciate if someone can help. Also, this is my first post here so try to forgive me if I make a mistake in posting.
Error: NoReverseMatch at /post/5/
Reverse for 'post_delete' not found. 'post_delete' is not a valid view function or pattern name.
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.postList, name='post_list'),
path('post/new/', views.postNew, name='post_new'),
path('post/<int:pk>/', views.postDetail, name='post_detail'),
path('post/edit/<int:pk>/', views.postEdit, name='post_edit'),
path('post/delete/<int:pk>/', views.postDelete, name='post_delete'),
]
views.py
from django.shortcuts import render, redirect, get_object_or_404
from blog.models import Post
from blog.forms import PostForm
from django.utils import timezone
import datetime
# Create your views here.
def postList(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by(
"published_date").reverse()
context = {
'posts': posts
}
return render(request, "blog/post_list.html", context)
def postDetail(request, pk):
post = get_object_or_404(Post, pk=pk)
context = {
'post': post
}
return render(request, 'blog/post_detail.html', context)
def postNew(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.published_date = timezone.now()
post.save()
return redirect("post_detail", pk=post.pk)
else:
return redirect("post_new")
else:
form = PostForm()
context = {
'form': form
}
return render(request, 'blog/post_edit.html', context)
def postEdit(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == 'POST':
form = PostForm(request.POST, instance=post)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.published_date = timezone.now()
post.save()
return redirect("post_detail", pk=post.pk)
else:
return redirect("post_edit", pk=post.pk)
else:
form = PostForm(instance=post)
context = {
'form': form
}
return render(request, 'blog/post_edit.html', context)
def postDelete(request, pk):
post = get_object_or_404(Post, pk=pk)
post.delete()
return redirect("post_list")
The template which is giving error
{% extends 'blog/base.html' %}
{% block content %}
<article class="post">
<time style="float: right; margin-right: 20px; opacity: 0.7;">published : {{post.published_date}}</time>
<h2><a href="{% url 'post_detail' pk=post.pk %}" style="text-decoration: none; float: left;">{{post.title}}</a></h2>
{% if user.is_authenticated %}
<aside style="float: left;">
<a class="btn btn secondary" href="{% url 'post_edit' pk=post.pk %}">
{% include './icons/pencil-fill.svg' %}
</a>
</aside>
<aside style="float: left;">
<a class="btn btn secondary" href="{% url 'post_delete' pk=post.pk %}">
{% include './icons/lock-fill.svg' %}
</a>
</aside>
{% endif %}
<p style="clear: both; word-wrap: break-word;" >{{post.text}}</p>
</article>
{% endblock content %}
Base Template which is extended
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>
Ayush's Blog
</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link href="//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css">
<link rel="stylesheet" href={% static 'css/blog.css' %}>
</head>
<body style="overflow-y: scroll;">
<header class="page-header">
<div class="container">
{% if user.is_authenticated %}
<a href="{% url 'post_new' %}" class="top-menu">
{% include './icons/file-earmark-plus.svg' %}
</a>
{% endif %}
<h1><a href="/" style="text-decoration: none;">Ayush's Blog</a></h1>
</div>
</header>
{% block content %}{% endblock content %}
</body>
</html>
Thank you for any and all help
Edit:
Here is the full trace back
Environment:
Request Method: GET
Request URL: http://rail.pythonanywhere.com/post/5/
Django Version: 3.2.15
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Template error:
In template /home/rail/rail.pythonanywhere.com/blog/templates/blog/base.html, error at line 19
Reverse for 'post_delete' not found. 'post_delete' is not a valid view function or pattern name.
9 : </title>
10 : <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
11 : integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
12 : <link href="//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css">
13 : <link rel="stylesheet" href={% static 'css/blog.css' %}>
14 : </head>
15 :
16 : <body style="overflow-y: scroll;">
17 : <header class="page-header">
18 : <div class="container">
19 : {% if user.is_authenticated %}
20 : <a href="{% url 'post_new' %}" class="top-menu">
21 : {% include './icons/file-earmark-plus.svg' %}
22 : </a>
23 : {% endif %}
24 : <h1><a href="/" style="text-decoration: none;">Ayush's Blog</a></h1>
25 : </div>
26 : </header>
27 : {% block content %}{% endblock content %}
28 :
29 : </body>
Traceback (most recent call last):
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/rail/rail.pythonanywhere.com/blog/views.py", line 24, in postDetail
return render(request, 'blog/post_detail.html', context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 170, in render
return self._render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
return self.nodelist.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
return self.nodelist.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/defaulttags.py", line 315, in render
return nodelist.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/template/defaulttags.py", line 449, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/urls/base.py", line 86, in reverse
return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
File "/home/rail/.virtualenvs/rail.pythonanywhere.com/lib/python3.8/site-packages/django/urls/resolvers.py", line 698, in _reverse_with_prefix
raise NoReverseMatch(msg)
Exception Type: NoReverseMatch at /post/5/
Exception Value: Reverse for 'post_delete' not found. 'post_delete' is not a valid view function or pattern name.