I’m learning django on a small project called BlogPost from a python’s book. This is a very simple project on its own – user can add a post with title and text.
I’m trying to add functionality of editting existed entries via views.py function called “edit_entry” and i receive exception which i can’t overcome:
NoReverseMatch at /edit_entry/6/
Request URL: http://127.0.0.1:8000/edit_entry/6/
Raised during: blogs.views.edit_entry
Reverse for ‘edit_entry’ with arguments ‘(”,)’ not found. 1 pattern(s) tried: [‘edit_entry/(?P<object_id>[0-9]+)/Z’]
Does anybody know what could be a proble?
Here is my code:
models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class BlogPost(models.Model):
"""Create data model"""
topic = models.CharField(max_length=100)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-date_added']
def __str__(self):
return self.topic
forms.py
from django.forms import ModelForm
from .models import BlogPost
class NewEntryForm(ModelForm):
class Meta():
model = BlogPost
fields = ['topic','text']
labels = {'topic':'Topic', 'text': 'Text'}
urls.py
from django.urls import path
from . import views
app_name = 'blogs'
urlpatterns = [
path('', views.index, name='index'),
path('entries/', views.entries, name='entries'),
path('new_entry/', views.new_entry, name='new_entry'),
path('edit_entry/<int:object_id>/', views.edit_entry, name='edit_entry')
views.py
from django.shortcuts import render, redirect
from django.http import request
from .models import BlogPost
from .forms import NewEntryForm
# Create your views here.
def index(request):
"""Show main page"""
return render(request, "blogs/index.html")
def entries(request):
"""Shows all entries based on pub. date"""
object = BlogPost.objects.all()
context = {'objects': object}
return render(request,"blogs/entries.html", context)
def new_entry(request):
"""To add new entry"""
if request.method != 'POST':
form = NewEntryForm()
else:
form = NewEntryForm(data=request.POST)
if form.is_valid():
form.save()
return redirect('blogs:entries')
context = {'form':form}
return render(request, 'blogs/new_entry.html', context)
def edit_entry(request, object_id):
"""To edit existed entry"""
entry = BlogPost.objects.get(id=object_id)
if request.method != 'POST':
form = NewEntryForm(instance=entry)
else:
form = NewEntryForm(instance=entry, data=request.POST)
if form.is_valid():
form.save()
return redirect('blogs:entries', object_id=object.id)
context={'form':form}
return render(request, 'blogs/edit_entry.html', context)
entries.html
{% extends "blogs/base.html"%}}
{% block content %}
<h3>Your entries:</h3>
<button name="new_entry"><a href="{% url 'blogs:new_entry' %}">New entry</a></button>
<ul>
{% for object in objects %}
<li>
<p>Title: {{ object.topic }}</p>
<p>Date: {{ object.date_added }}</p>
<p>Text: {{ object.text }}</p>
<p><a href="{% url 'blogs:edit_entry' object.id %}">Edit</a></p>
</li>
{% endfor %}
</ul>
{% endblock %}
edit_entries.html
{% extends "blogs/base.html"%}}
{% block content %}
<h2> You can edit your entries here</h2>
#<form action="{% url 'blogs:edit_entry' object.id %}" method="post">
# {% csrf_token %}
# {{ form.as_p }}
# <button name="submit">save</button>
</form>
{% endblock %}
I can’t understand the problem. I have a hypothesis that something wrong in edit_entry function.
Nikolay is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.