Home > OS >  Django blog app won't display edit posts page
Django blog app won't display edit posts page

Time:11-17

Currently working through the Python Crash Course Django section I've got everything but the edit posts page working. I added the edit post link under each post but this error now displays when you try to view the homepage:

Reverse for 'edit_post' with no arguments not found. 1 pattern(s) tried: ['edit_post/(?P<post_id>[0-9] )/$']

Here is the code I've been using.

from django.db import models

# Create your models here.

class BlogPost(models.Model):
    """A topic the user is learning about"""
    title = models.CharField(max_length=200)
    body = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """A place for the user to create a blog post"""
        return self.title

Views

from django.shortcuts import render, redirect

from .models import BlogPost
from .forms import BlogForm

# Create your views here.

def index(request):
    """The home page for Blog"""
    return render(request, 'blogs/index.html')


def blogposts(request):
    """Show all blogposts"""
    blogposts = BlogPost.objects.order_by('date_added') 
    context = {'blogposts': blogposts}
    return render(request, 'blogs/blogposts.html', context)


def new_post(request):
    """Add a new post"""
    if request.method != 'POST':
        # No data submitted, create a blank form
        form = BlogForm()
    else:
        # POST data submitted; process data
        form = BlogForm(data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('blogs:blogposts')

    # Display a blank or invalid form
    context = {'form': form}
    return render(request, 'blogs/new_post.html', context)


def edit_post(request, post_id):

    current_entry = BlogPost.objects.get(id=post_id)
    

    if request.method != 'POST':
        # Initial request; pre-fill form with current entry
        form = BlogForm(instance=current_entry)
    else:
        form = BlogForm(instance=current_entry, data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('blogs:index')

    context = {'post':post, 'form':form}
    return render(request, 'blogs/edit_post.html', context)

URLs

"""Defines URL patterns for blogs"""

from django.urls import path

from . import views

app_name = 'blogs'
urlpatterns = [
    # Home page
    path('', views.index, name='index'),
    # Page that shows all topics
    path('blogposts/', views.blogposts, name='blogposts'),
    # Page that displays a single post
    path('new_post/', views.new_post, name='new_post'),
    # Page for editing a post
    path('edit_post/<int:post_id>/', views.edit_post, name='edit_post'),
]

blogposts.html

{% extends "blogs/base.html" %}

{% block content %}

    <p>Blog Posts</p>

    <ul>
        {% for blogpost in blogposts %}
            <h1>{{ blogpost }}</h1>
            <p>{{ blogpost.body }}</p>
            <a href="{% url 'blogs:edit_post' %}">Edit post</a>
        {% empty %}
            <li>No blogs have been posted yet</li>
        {% endfor %}    
    </ul>

    <a href="{% url 'blogs:new_post' %}">Create a new post</a>

{% endblock content %}

edit_post.html

{% extends "blogs/base.html" %}

{% block content %}

    <p>Edit post:</p>

    <form action="{% url 'blogs:edit_post' post.id %}" method='post'>
        {% csrf_token %}
        {{ form.as_p }}
        <button name="submit">Save Changes</button>
    </form>

{$ endblock content %}

CodePudding user response:

You need to pass the id of the blog post you want to edit.

So in your blogposts.html try:

"{% url 'blogs:edit_post' blogpost.pk %}"
  • Related