Реверс для 'post_detail' с аргументами '('',)' не найден. Попытка 1 шаблона(ов): ['(?P<slug>[-a-zA-Z0-9_]+)/\\Z']
получаю следующую ошибку при добавлении ссылки возврата назад в моем comment_delete.html:
Повтор для 'post_detail' с аргументами '('',)' не найден. Испробован 1 шаблон(ы): ['(?P[-a-zA-Z0-9_]+)/\Z']
Все работает без ссылки на возврат (удаление комментария). Хотелось бы узнать, что я делаю не так в моем comment_delete (href="{% url 'post_detail' post.slug %}") Go back
Спасибо :)
models.py:
class Post(models.Model):
title = models.CharField(
max_length=200, unique=True,
default=str(f'Fishing {datetime.today()}')[:24]
)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='blog_posts'
)
featured_image = CloudinaryField('image', default='placeholder')
excerpt = models.TextField(blank=True)
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=1)
likes = models.ManyToManyField(
User, related_name='blogpost_like', blank=True)
class Meta:
ordering = ['-created_on']
def __str__(self):
return self.title
def number_of_likes(self):
return self.likes.count()
def get_absolute_url(self):
return reverse('post_detail', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
return super().save(*args, **kwargs)
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE,
related_name='comments')
author = models.ForeignKey(User, on_delete=models.CASCADE,
related_name='blog_comments')
body = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
approved = models.BooleanField(default=True)
class Meta:
ordering = ['created_on']
def __str__(self):
return f'Comment {self.body} by {self.author}'
views.py
class CommentDelete(LoginRequiredMixin,
SuccessMessageMixin,
UserPassesTestMixin,
generic.DeleteView):
model = Comment
template_name = 'comment_delete.html'
success_message = "Comment Deleted"
def get_success_url(self):
slug = self.kwargs['slug']
return reverse_lazy('post_detail', kwargs={'slug': slug})
def delete(self, request, *args, **kwargs):
messages.success(self.request, self.success_message)
return super(CommentDelete, self).delete(request, *args, **kwargs)
def test_func(self):
comment = self.get_object()
if self.request.user == comment.author:
return True
return False
urls.py
path('<slug:slug>/comment-delete/<int:pk>', views.CommentDelete.as_view(),
name='comment_delete'),
post_detail.html
{% if request.user == comment.author %}
<a href="{% url 'comment_delete' post.slug comment.pk %}">Delete Comment</a>
{% endif %}
comment_delete.html
<div class="form-group">
<button class="btn btn-outline-danger" type="submit">Delete</button>
<a class="btn btn-outline-secondary" href="{% url 'post_detail' post.slug %}">Go back</a>
</div>
Вы пытаетесь передать slug
объекта Post
, который не существует: {% url 'post_detail' post.slug %}
. Вам необходимо убедиться, что у вас нет ссылок на Post
, которые уже были удалены.
Не уверен, что понимаю, я не хочу удалять комментарий в посте, поэтому я хочу вернуться к посту вместо этого. Если я сделаю только {% url 'post_detail' comment.pk %} я могу получить доступ к delete_comment.html, но ссылка для возврата назад не работает...