Добавить комментарий к фильтру в Django
У меня проблема с добавлением комментариев только пробелы или энтер. Я не знаю, как это отфильтровать. Если пользователь отправляет обычный комментарий, то он переносится на текущую страницу, но если отправляет только пробелы или энтер, то он переносится на URL comment.
Это мой код: models.py
class Post(models.Model):
"""Post Model"""
hash = models.UUIDField(default=uuid.uuid4, editable=False)
title = models.CharField("Title", max_length=200)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name="created_by",
on_delete=models.CASCADE,
default=current_user.CurrentUserMiddleware.get_current_user,
)
category = TreeForeignKey(Category, verbose_name="Category", related_name="items", on_delete=models.CASCADE)
tags = TaggableManager()
image = models.ImageField("Image", upload_to=get_timestamp_path)
content = RichTextUploadingField()
create_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.title}"
def get_absolute_url(self):
return reverse("main:post_detail", args=[self.slug])
def save(self, *args, **kwargs):
if str(self.hash) not in self.slug:
self.slug = f"{self.slug}-{self.hash}"
super().save(*args, **kwargs)
def get_comment(self):
return self.comment_set.all()
class Comment(models.Model):
user = models.ForeignKey(User, verbose_name="User", on_delete=models.CASCADE)
post = models.ForeignKey(Post, verbose_name="Post", on_delete=models.CASCADE)
text = models.TextField(verbose_name="Comment")
create_at = models.DateTimeField("Date of creating", auto_now=True)
class Meta:
verbose_name = "Comment"
verbose_name_plural = "Comments"
def __str__(self):
return str(self.user)
views.py
class PostDetail(DetailView, MultipleObjectMixin):
model = Post
context_object_name = 'post'
paginate_by = 10
template_name = 'main/post_detail.html'
def get_context_data(self, **kwargs):
comments = Comment.objects.filter(post=self.get_object())
context = super(PostDetail, self).get_context_data(object_list=comments, **kwargs)
return context
class AddComment(LoginRequiredMixin, CreateView):
"""Add Comment"""
model = Post
form_class = CommentForm
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.post_id = self.kwargs.get('pk')
self.success_url = form.instance.post.get_absolute_url()
form.save()
return super(AddComment, self).form_valid(form)
urls.py
path('comment/<int:pk>/', AddComment.as_view(), name="add_comment"),
forms.py
class CommentForm(forms.ModelForm):
"""Post Form"""
class Meta:
model = Comment
fields = ["text"]
post_detail.html
<form id="formComment" method="post" action="{% url 'main:add_comment' post.id %}">
{% csrf_token %}
<div class="row">
<div class="col form-group">
<textarea name="text" class="form-control" placeholder="Your Comment*" required></textarea>
</div>
</div>
<button type="submit" class="btn btn-primary">Post Comment</button>
</form>
Если я отправляю комментарий с энтерами и пробелами, то получаю эту ошибку
TemplateDoesNotExist at /comment/1/
main/post_form.html
Вы не определили имя шаблона в представлении AddComment.
Поскольку вы используете CreateView для добавления комментариев, вы должны использовать отдельную страницу для отображения CommentForm. и создать отдельный url для деталей поста и для создания комментария.
Кроме того, если вы хотите убрать пробелы и табуляцию, вы можете использовать строковый метод isspace() https://www.geeksforgeeks.org/python-string-isspace-method/