Post() missing 1 required positional argument: 'slug'
I'm facing a problem in my Django project, and I need your help. When I try to access the view that handles requests to the post page, I get the following error:
post() missing 1 required positional argument: 'slug'
This happens when I try to navigate to a URL that should handle viewing a specific post. I have determined the route in urls.py , which takes the slug parameter, and it looks like this:
path('post//', post, name='post'),
In my post view, I expect to accept this parameter, but it looks like it is not being passed properly.
I would really appreciate any help or advice.
My models.py:
from django.db import models
from django.utils.text import slugify
from django.contrib.auth import get_user_model
from django_resized import ResizedImageField
from tinymce.models import HTMLField
from hitcount.models import HitCountMixin, HitCount
from django.contrib.contenttypes.fields import GenericRelation
from taggit.managers import TaggableManager
from django.shortcuts import reverse
User= get_user_model()
class Author(models.Model):
user =models.ForeignKey(User,on_delete=models.CASCADE)
fullname = models.CharField(max_length=40,blank=True)
slug = slug = models.SlugField(max_length=400,unique=True,blank=True)
bio = models.TextField(HTMLField)
points = models.IntegerField(default=0)
profile_pic = ResizedImageField(size=[50,80],quality=100,upload_to='authors',default=None,null=True,blank=True)
def __str__(self):
return self.fullname
def save(self,*args,**kwargs):
if not self.slug:
self.slug = slugify(self.fullname)
super(Author,self).save(*args, **kwargs)
class Category(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField(max_length=400,unique=True,blank=True)
class Meta:
verbose_name_plural = 'categories'
def __str__(self):
return self.title
def save(self,*args,**kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Category,self).save(*args, **kwargs)
class Post(models.Model):
title = models.CharField(max_length=400)
slug = models.SlugField(max_length=400,unique=True,blank=True)
user = models.ForeignKey(Author,on_delete=models.CASCADE)
content = HTMLField()
categories = models.ManyToManyField(Category)
date = models.DateTimeField(auto_now_add=True)
approved = models.BooleanField(default=False)
hit_count_generic =GenericRelation(HitCount,object_id_field='object_pk',
related_query_name='hit_count_generic_relation'
)
tags = TaggableManager()
def save(self,*args,**kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Post,self).save(*args, **kwargs)
def __str__(self):
return self.title
def get_url(self):
return reverse("detail", kwargs={'slug': self.slug})
My urls.py:
from django.urls import path
from .views import home
from .views import detail,post
urlpatterns = [
path('', home, name='home'),
path('detail/<slug>/', detail, name='detail'),
path('post/<slug>/',post,name='posts'),
]
My views.py:
from django.shortcuts import render,get_object_or_404
from .models import Author,Category,Post
from .utils import update_views
def home(request):
return render(request, 'home.html')
def detail(request,slug):
post = get_object_or_404(Post,slug=slug)
context = {
'post':post,
}
update_views(request,post)
return render(request, 'detail.html',context)
def post(request,slug):
category = get_object_or_404(Category,slug=slug)
posts= Post.objects.filter(approved=True,categories=category)
context={
"posts":posts,
}
return render(request, 'posts.html',context)
def image(request):
return render(request, 'detail.html')
You're missing the converter type in your url, try these:
path('post/<str:slug>/', post, name='post')
path('post/<slug:slug>/', post, name='post')