在基于Django类的视图中获取发布实例

问题描述

我目前使用基于功能的视图来让用户在帖子上发表评论,但我正在尝试将其转换为基于类的视图

功能views.py

def comment(request,pk):  
  form = CommentForm(request.POST)
  # Post instance
  post_instance = get_object_or_404(Post,pk=pk)

  if request.method == 'POST':
    if form.is_valid:
      obj = form.save(commit=False)
      obj.commenter = request.user
      obj.post = post_instance
      obj.save()
      return redirect('/')
  else:
    messages.error(request,'Comment Failed')
    
  return render(request,'comment.html',{'form': form})

class views.py

class CommentView(FormView):
  template_name = 'comment.html'
  form_class = CommentForm
  success_url = '/'

  def get_object(self):
    pk = self.kwargs.get('pk')
    post_instance = get_object_or_404(Post,pk=pk)
    return post_instance

  def form_valid(self,form):
    obj = form.save(commit=False)
    obj.commenter = self.request.user
    obj.post = post_instance
    obj.save()
    return super().form_valid(form)

我正在尝试使用相同的逻辑来保存评论,但出现错误:未定义名称'post_instance'

get_object()返回“ post_instance”变量,但我无法访问它。 你们可以告诉我我在哪里做错了,谢谢!

解决方法

您可以尝试:

class CommentView(FormView):
  template_name = 'comment.html'
  form_class = CommentForm
  success_url = '/'

  def get_object(self):
    pk = self.kwargs.get('pk')
    post_instance = get_object_or_404(Post,pk=pk)
    return post_instance

  def form_valid(self,form):
    obj = form.save(commit=False)
    obj.commenter = self.request.user
    obj.post = self.get_object()
    obj.save()
    return super().form_valid(form)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...