Почему имя 'self' не определено в django, даже если self включен в систему

Я делаю приложение для веб блога на django и оно работало довольно хорошо до того, как я добавил подобную функциональность. Это что-то, чего мне не хватает с представлением (Нужно ли мне создать представление на основе класса для этого). Я пробовал это, но тоже не сработало. Всякий раз, когда я создаю url для поста, я получаю эту ошибку. У вас есть какие-нибудь предложения. Помогите заранее

post_detail() missing 1 required positional argument: 'self'

вот код

views.py

def post_detail(request,slug,self):
    template_name = "post_detail.html"
    post = get_object_or_404(Post, slug=slug)

    stuff = get_object_or_404(Post, id=self.kwargs['pk'])
    total_likes = stuff.total_likes()   
    
    liked = False
    if stuff.likes.filter(slug=self.request.user.id).exists():
        liked = True

    context["total_likes"] = total_likes
    context["liked"] = liked


    comments = post.comments.filter(active=True).order_by("-created_on")
    new_comment = None
    # Comment posted
    if request.method == "POST":
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():

            # Create Comment object but don't save to database yet
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
    else:
        comment_form = CommentForm()

    return render(
        request,
        context,
        template_name,
        {
            "post": post,
            "comments": comments,
            "new_comment": new_comment,
            "comment_form": comment_form,
        },
    )
def LikeView(request, pk):
    post = get_object_or_404(Post, id=request.POST.get('post_id'))
    liked = False
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
        liked = False
    else:
        post.likes.add(request.user)
        liked = True
    
    return HttpResponseRedirect(reverse('post_detail', args=[str(pk)]))

urls.py

path('like_post/<int:pk>', LikeView, name="like_post")

models.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
    updated_on = models.DateTimeField(auto_now= True)
    content = SummernoteTextField(blank=True, null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    image = models.ImageField(upload_to='images',null=True, blank=True)
    category = models.ForeignKey('blog.category', on_delete=models.SET_NULL, null=True, blank=True)
    likes = models.ManyToManyField(User, related_name='blog_Post')

    def total_likes(self):
        return self.likes.count()

    class Meta:
        ordering = ['-created_on'] # this is used to order blog posts using time

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

    def get_absolute_url(self):
        
        return reverse('home')

Представление на основе функции не принимает self, поскольку эта функция не определена в области видимости класса, представление на основе функции, таким образом, принимает два параметра: request, и pk:

#                   no self ↓
def post_detail(request,slug):
    # …

В пункте .filter(…) следует использовать request.user.id, а не self.request.user.id Также довольно "странно", что вы сопоставляете slug с этим, обычно это должен быть первичный ключ: filter(pk=request.user.pk).exists().

Что касается представления LikeView, вы должны использовать .slug пост, а не первичный ключ .pk:

from django.shortcuts import redirect

def LikeView(request, pk):
    post = get_object_or_404(Post, id=pk)
    liked = False
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
        liked = False
    else:
        post.likes.add(request.user)
        liked = True
    
    return redirect('post_detail', slug=post.slug)

Возможно, было бы лучше сделать два представления: like_view и dislike_view. Тогда вы сможете делать запросы idempotent [wiki].

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