Search code examples
pythondjangoviewmodelslug

Slug URL turns into a number when navigating to the next link in django


I tried searching for this problem here but I didn't find anything, I hope someone can help answering or sending a link to a solution on stackoverflow...

I have been creating a blog, and when I click on the post title, it goes to 'post_details.html' and in the URL shows a slug with the post title. Like here:

examplename.com/blog/brooklyn-nets-at-miami-heat-preview/

But when I click to write a comment on the post it takes me to a form page, but the slug title disappear, it just shows the post number. Like this:

examplename.com/blog/3/add-comment

Can someone explain why is this happening? I want to know how to solve this and understand from where it comes this number that shows up.

Post_detail.html

{% block content %}
<h2 class="title">
    <a class="post-title" href="{{ post.get_absolute_url }}">
        {{ post.title }}
    </a>
</h2>
<p class="date">
    Publicado em {{ post.created }} por {{ post.author }}
</p>
{{ post.body|linebreaks }}
<hr>
<h3>Comments</h3>
{% if not post.comments.all %}
    Nobody commented yet...<a href="{% url 'blog:commentview' post.pk %}">Add a comment</a>
{% else %}
    <a href="{% url 'blog:commentview' post.pk %}">Add a comment</a>
    {% for comment in post.comments.all %}
        {{ comment.name }}
        {{ comment.date }}
        <br>
        {{ comment.body }}
    {% endfor %}
{% endif %}
    <a class="swen" href="{% url 'blog:list' %}">More Articles</a>
{% endblock %}

urls.py

from unicodedata import name
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path("", views.PostListView.as_view(), name="list"),
path("<slug:slug>/", views.PostDetailView.as_view(), name="detail"),
path("<slug:slug>/add-comment", views.CommentView.as_view(), name="commentview")
]

models.py

from django.contrib.auth.models import User
from django.db import models
from django.urls import reverse

class Post(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse ('blog:detail', kwargs={"slug":self.slug})

class Meta:
    ordering = ("-created",)

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    body = models.TextField()
    date = models.DateField(auto_now_add=True)
    slug = Post.slug

def __str__(self):
    return reverse (self.post.title, self.name, self.post.slug)

views.py

from xml.etree.ElementTree import Comment
from django.views.generic import DetailView, ListView, CreateView
from .models import Post, Comment

class PostListView(ListView):
    model = Post 

class PostDetailView(DetailView):
    model = Post

class CommentView(CreateView):
    model = Comment
    template_name = 'add_comment.html'
    fields = '__all__'

Solution

  • you're passing pk which is a type integer as parameter instead of a slug at path name commentview. May be you should check on that.