Почему имя '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].