首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Ajax添加到注释部分不起作用

将Ajax添加到注释部分不起作用
EN

Stack Overflow用户
提问于 2020-11-19 14:46:17
回答 1查看 75关注 0票数 0

我试图将Ajax添加到我的注释部分,以避免每次添加注释时页面刷新。

因此,我从新comments.html中将注释部分加载到post-details.html,并将实现的Ajax加载到post中,但我的问题是它没有产生任何效果,页面需要刷新以显示新的注释。

我在views.py中对泛型views.py类进行了子类化,并试图根据在views.py中接收到的参数找到一种以JSON格式返回数据的方法。以下是我尝试过的:

代码语言:javascript
复制
class PostDetailView(DetailView):
    model = Post
    template_name = "blog/post_detail.html"  # <app>/<model>_<viewtype>.html

    def get_context_data(self, *args, **kwargs):
        context = super(PostDetailView, self).get_context_data()
        post = get_object_or_404(Post, slug=self.kwargs['slug'])
        comments = Comment.objects.filter(
            post=post).order_by('-id')
        total_likes = post.total_likes()
        liked = False
        if post.likes.filter(id=self.request.user.id).exists():
            liked = True

        if self.request.method == 'POST':
            comment_form = CommentForm(self.request.POST or None)
            if comment_form.is_valid():
                content = self.request.POST.get('content')
                comment_qs = None

                comment = Comment.objects.create(
                    post=post, user=self.request.user, content=content)
                comment.save()
                return HttpResponseRedirect("blog/post_detail.html")
        else:
            comment_form = CommentForm()

        context["comments"] = comments
        context["comment_form"] = comment_form
        context["total_likes"] = total_likes
        context["liked"] = liked

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

但这给了我TypeError的应有之处:

代码语言:javascript
复制
TypeError: context must be a dict rather than JsonResponse.

这是回溯:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Users\User\Desktop\Project\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\User\Desktop\Project\venv\lib\site-packages\django\core\handlers\base.py", line 202, in _get_response
    response = response.render()
  File "C:\Users\User\Desktop\Project\venv\lib\site-packages\django\template\response.py", line 105, in render
    self.content = self.rendered_content
  File "C:\Users\User\Desktop\Project\venv\lib\site-packages\django\template\response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "C:\Users\User\Desktop\Project\venv\lib\site-packages\django\template\backends\django.py", line 59, in render
    context = make_context(context, request, autoescape=self.backend.engine.autoescape)
  File "C:\Users\User\Desktop\Project\venv\lib\site-packages\django\template\context.py", line 268, in make_context
    raise TypeError('context must be a dict rather than %s.' % context.__class__.__name__)

在控制台中,我收到了以下错误:

代码语言:javascript
复制
GET http://127.0.0.1:8000/blog/blog-4/ 500 (Internal Server Error)  jquery.min.js:2 

以下是评论部分:

代码语言:javascript
复制
        <!-- Submit Comment -->
        <div class="container-fluid mt-2">
            <div class="form-group row">
                <form action="{% url 'blog:post-comment' post.slug %}" method="post" class="comment-form" action=".">
                {% csrf_token %}
                {{ comment_form.as_p }}
                <input type="submit" name="post_id" value='Submit' class="btn btn-outline-success">
<!--                <button type="submit" class="btn btn-outline-success">Submit</button>-->
                </form>
            </div>
        </div>
        <!-- Submit Comment -->

        <!-- Show Comment -->
        <button class="cmt_btn btn btn-outline-info mb-0">Show / Hide {{comments.count}} Comment{{comments|pluralize}}</button>
            <div class="comment-box">
            {% for comment in comments %}
                <ul class="mt-3 list-unstyled">
                  <li class="media">
                    <img class="rounded-circle article-img" src="{{ comment.post.author.profile.image.url }}">
                      <div class="media-body">
                      <h5 class="mt-0 mb-1">{{comment.user| capfirst}}<small class="text-muted">- {{ comment.created}}</small> </h5>
                        <hr class="solid mt-0">
                         {% if comment.user == user %}
                          <div>
                            <a class="float-right mr-3" href="{% url 'blog:delete-comment' comment.id%}">Delete </a>
                          </div>
                        {% endif %}
                        {{ comment.content}}
                      </div>
                  </li>
                </ul>
            {% endfor %}
            </div>
        <!-- Show Comment -->

这是剧本

代码语言:javascript
复制
    <script>
        $(document).on('submit', '.comment-form', function(event){
          event.preventDefault();
          console.log($(this).serialize());
          $.ajax({
            type: 'POST',
            url: $(this).attr('action'),
            data: $(this).serialize(),
            dataType: 'json',
            success: function(response) {
              $('.main-comment-section').html(response['form']);
              $('textarea').val('');
            },
            error: function(rs, e) {
              console.log(rs.responseText);
            },
          });
        });
    </script>

我的问题是:

获得此错误的原因是什么,以及如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-19 15:03:12

函数get_context_data仅用于为上下文构建数据,而不是处理ajax请求。您需要拆分您的函数,以便为GET数据提供处理。

示例结构

代码语言:javascript
复制
class PostDetailView(DetailView):
    model = Post
    template_name = "blog/post_detail.html"  # <app>/<model>_<viewtype>.html

    def get_context_data(self, *args, **kwargs):
        [...]
        return context

    def get(self, request, *args, **kwargs):
        if self.request.is_ajax():
            context = self.get_context_data(self, *args, **kwargs)
            html = render_to_string('blog/comments.html', context, request=self.request)
            return JsonResponse({'form': html})
        [...]
    
    def post(self, request, *args, **kwargs):
        [...]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64914050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档