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')

Вернуться на верх