按照教程,我得到了一个重新调整 None 的视图,因为 is_ajax 不起作用

Posted

技术标签:

【中文标题】按照教程,我得到了一个重新调整 None 的视图,因为 is_ajax 不起作用【英文标题】:Following a tutorial I got a view retuning None instead because is_ajax is not working 【发布时间】:2021-07-24 15:39:11 【问题描述】:

我刚开始使用 ajax,但似乎找不到解决方法。我认为这可能与comment_id 与blog_id 有关。 (按照本教程:https://www.youtube.com/watch?v=VoWw1Y5qqt8&list=PLKILtxhEt4-RT-GkrDkJDLuRPQfSK-6Yi&index=39&ab_channel=AbhishekVerma)。

这就是我的views.py的样子

def like_comment(request):
comment = get_object_or_404(Comment, id=request.POST.get("comment_id"))
blog = get_object_or_404(BlogPost, id=request.POST.get("blog_id"))
comments = Comment.objects.filter(post=blog, reply=None)
if request.user in comment.likers.all():
    comment.likers.remove(request.user)
else:
    comment.likers.add(request.user)
context = 
    "comments": comments,
    "blog_post": blog,
    "body": markdown2.markdown(blog.body),
    "comment_form": CommentForm(),


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

这是我的 HTML 的 sn-p

% if request.user.is_authenticated % 
 <form action=% url 'like_comment' % method="POST">
% csrf_token %
% if user in comment.likers.all %
<input type="hidden" name="blog_id" value="  blog_post.id ">
<button type="submit" id="like" name="comment_id" value=" comment.id ">Like</button>
% else %
<input type="hidden" name="blog_id" value="  blog_post.id ">
<button type="submit" id="like" name="comment_id" value=" comment.id ">Dislike</button>
% endif %
% else %
<div><small class="comment_time">Login to Like</small></div>
% endif %
</form>
 </div>
 <small class="comment_time"> comment.total_likes 
Likes</small>

这是javascript

$(document).ready(function (event) 
        $(document).on('click', '#like', function (event) 
            event.preventDefault();
            var pk = $(this).attr('value');
            $.ajax(
                type: "POST",
                url: '% url "like_comment" %',
                data:  'blog_id': pk, 'csrfmiddlewaretoken': ' csrf_token ' ,
                dataType: 'json',
                success: function (response) 
                    $('#like_section').html(response['form'])
                    console.log($('#like_section').html(response['form']));
                ,
                error: function (rs, e) 
                    console.log(rs.responseText);
                ,
            );
        );
    );

我收到以下错误: Picture

【问题讨论】:

也许这对你有帮助:***.com/questions/8587693/… @Razenstein 我已经看过那个帖子,但没有发现任何有用的东西,可能是因为我不完全理解它 【参考方案1】:

我将开始检查请求标头是否包含 HTTP_X_REQUESTED_WITH='XMLHttpRequest'。您可以使用浏览器的调试功能(例如 firefox)来做到这一点。也许您的 JS 库没有发送此标头。

查看 Django 文档: https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.is_ajax

 def is_ajax(self):
        return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

HttpRequest.is_ajax():

如果请求是通过 XMLHttpRequest 发出的,则返回 True,方法是检查字符串“XMLHttpRequest”的 HTTP_X_REQUESTED_WITH 标头。大多数现代 JavaScript 库都会发送此标头。如果您编写自己的 XMLHttpRequest 调用(在浏览器端),如果您希望 is_ajax() 正常工作,则必须手动设置此标头。

如果响应因是否通过 AJAX 请求而有所不同,并且您正在使用某种形式的缓存(例如 Django 的缓存中间件),您应该使用 vary_on_headers('X-Requested-With') 来装饰视图,以便响应正确缓存。

【讨论】:

以上是关于按照教程,我得到了一个重新调整 None 的视图,因为 is_ajax 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

媒体查询不起作用?

使用自动布局删除和重新添加子视图

调整大小时 QListView 图标模式不重新布局

在Django视图函数中无法检索AJAX请求数据值。

状态栏重新出现时视图控制器不会自动调整大小

使用自动布局调整同级视图的大小时,使用子视图重新定位 UIView 不起作用