#python #python-3.x #django #django-views #django-class-based-views
#python #python-3.x #django #django-просмотры #django-class-based-views
Вопрос:
Я добавил систему комментариев к сообщениям в проекте блога, и я пытаюсь добавить опцию для обновления и удаления комментариев пользователей, создавших комментарий.
Я пытаюсь использовать ту же концепцию, что и при создании сообщения и создании CBV для этих комментариев.
Создание комментария работает нормально и отображается правильно, единственное препятствие, с которым я сталкиваюсь, — это ошибка, когда пользователь нажимает на кнопку обновить или удалить при обновлении или удалении, она возвращает следующую ошибку:
Cannot resolve keyword 'slug' into the field. Choices are content, created, id, post, post_id, updated, user, user_id
что имеет смысл, поскольку в модели комментариев нет Slug.
Мой вопрос в том, как обновить или удалить комментарий и вернуться на ту же страницу post.slug в шаблоне без получения этой ошибки?
Вот models.py
class Post(models.Model):
slug = models.SlugField(blank=True, null=True, max_length=120)
------------------------------------------------------------
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
content = models.TextField(max_length=300, validators=[validate_comment_text])
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now=True)
Вот views.py
class PostCommentCreateView(LoginRequiredMixin, CreateView):
model = Comment
form_class = CommentForm
def form_valid(self, form):
post = get_object_or_404(Post, slug=self.kwargs['slug'])
form.instance.user = self.request.user
form.instance.post = post
return super().form_valid(form)
def form_invalid(self, form):
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
return reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug']))
class PostCommentUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Comment
fields = ['content'] # What needs to appear in the page for update
template_name = 'blog/post_detail.html' # <app>/<model>_<viewtype>.html
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
def form_invalid(self, form):
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
return reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug']))
def test_func(self):
comment = self.get_object()
if self.request.user == comment.user:
return True
return False
class PostCommentDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Comment
template_name = 'blog/postcomment_confirm_delete.html' # <app>/<model>_<viewtype>.html
def test_func(self):
comment = self.get_object()
if self.request.user == comment.user:
return True
return False
def form_invalid(self, form):
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
return reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug']))
вот urls.py
path('blog/<slug:slug>/update_comment/',
PostCommentUpdateView.as_view(), name='post-commentu'),
path('blog/<slug:slug>/delete_comment/',
PostCommentDeleteView.as_view(), name='post-commentd'),
вот шаблон:
{% if comment.user == user %}
<div>
<a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'blog:post-commentu' post.slug %}">Update</a>
<a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'blog:post-commentd' post.slug %}">Delete</a>
</div>
{% endif %}
Комментарии:
1. попробуйте
post__slug
здесьreturn reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug']))
или где именно возникает ошибка?2. @hansTheFranz Я добавил
href="{% url 'blog:post-commentu' post.slug %}
, чтобы обновить комментарий, связанный с пользователем, но когда я нажимаю на него, он возвращает ошибкуCannot resolve keyword 'slug' into field. Choices are: content, created, id, post, post_id, updated, user, user_id