how to fix "NameError: name 'context' is not defined"

how to fix "NameError: name 'context' is not defined"

我想在我的博客应用程序的评论和回复部分使用 ajax。在基于函数的视图中,一切正常,但我想在基于 class 的视图中进行。

***My function based view***
def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    comments = Comment.objects.filter(post=post, reply=None).order_by('-id')
    if request.method == 'POST':
        comment_form = CommentForm(request.POST or None)
        if comment_form.is_valid():
            content = request.POST.get('content')
            reply_id = request.POST.get('comment_id')
            comment_qs = None
            if reply_id:
                comment_qs = Comment.objects.get(id=reply_id)

            comment = Comment.objects.create(post=post,
                                             user=request.user,
                                             content=content,
                                             reply=comment_qs)
            comment.save()

    else:
        comment_form = CommentForm()
    context = {
        'title': 'blog',
        'post': post,
        'comments': comments,
        'comment_form': comment_form,
    }
    if request.is_ajax():
        html = render_to_string('blog/comments.html', context, request=request)
        return JsonResponse({'form': html})

    return render(request, 'blog/post_detail.html', context)

***My class based view***
class PostDetailView(FormMixin, DetailView):
    model = Post
    form_class = CommentForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        post = get_object_or_404(Post, id=self.object.id)
        comments = Comment.objects.filter(post=post, reply=None).order_by('-id')
        context['title'] = 'Blog Detail'
        context['comments'] = comments
        context['comment_form'] = self.get_form()
        return context

    def post(self, request, *args, **kwargs):
        #if request.user.is_authenticated():

        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            content = request.POST.get('content')
            reply_id = request.POST.get('comment_id')
            comment_qs = None
            if reply_id:
                comment_qs = Comment.objects.get(id=reply_id)
            comment = Comment.objects.create(post=self.object,
                                             user=request.user,
                                             content=content,
                                             reply=comment_qs)
            comment.save()
            #return HttpResponseRedirect(self.object.get_absolute_url())
        else:
            return self.form_invalid(form)

        if request.is_ajax():
            html = render_to_string('blog/comments.html', context, request=request)
            return JsonResponse({'form': html})

    def get_success_url(self):
        return reverse('post-detail', kwargs={'pk': self.kwargs['pk'], })

if request.is_ajax(): html = render_to_string('blog/comments.html', context,request=request) return JsonResponse({'form': html}) 中基于 class 的视图 部分它显示未定义上下文的错误。那么如何解决这个问题或者如何将它包含在函数中,因为我已经有了上下文。 我的基于函数的视图代码没有问题,它按预期工作。

在这个方法中:

def post(self, request, *args, **kwargs):
        ...
        ...

        if request.is_ajax():
            html = render_to_string('blog/comments.html', context, request=request)
            return JsonResponse({'form': html})

很简单,你使用了上下文,但它没有定义。将其作为参数传递或将其定义为变量

是因为。您使用了上下文变量,但尚未定义。

if request.is_ajax():
    html = render_to_string('blog/comments.html', context, request=request)
    return JsonResponse({'form': html})

试试这个获取上下文:

context = self.get_context_data(object=self.object)

你可以通过跟踪 DetailView 的源代码看到这一点,你会看到 DetailView 继承自 BaseDetailView,你会发现这个脚本来获取上下文

希望对您有所帮助!