Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django Ajax jQuery URL_Javascript_Jquery_Python_Ajax_Django - Fatal编程技术网

Javascript Django Ajax jQuery URL

Javascript Django Ajax jQuery URL,javascript,jquery,python,ajax,django,Javascript,Jquery,Python,Ajax,Django,我有下面的模板文件,我将在其中执行一个ajax请求。如果单击模板中的show链接,jquery函数将被执行,然后在浏览器的开发者控制台中收到以下错误消息: TypeError at/projects/djangobook/discussions/5/show/8 “非类型”对象不可调用 回溯: File "/Users/sebastian/Developer/Zaumdo/lib/python2.7/site-packages/django/core/handlers/base

我有下面的模板文件,我将在其中执行一个ajax请求。如果单击模板中的show链接,jquery函数将被执行,然后在浏览器的开发者控制台中收到以下错误消息:

  • TypeError at/projects/djangobook/discussions/5/show/8

  • “非类型”对象不可调用

回溯:

File "/Users/sebastian/Developer/Zaumdo/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)

File "/Users/sebastian/Developer/Zaumdo/lib/python2.7/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/Users/sebastian/Developer/Zaumdo/lib/python2.7/site-packages/braces/views.py" in dispatch
  107.             request, *args, **kwargs)

File "/Users/sebastian/Developer/Zaumdo/Zaumdo/core/mixins.py" in dispatch
  49.         return super(GroupAwareMixin, self).dispatch(request, *args, **kwargs)

File "/Users/sebastian/Developer/Zaumdo/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  86.         return handler(request, *args, **kwargs)

Exception Type: TypeError at /projects/djangobook/discussions/5/show/8

Exception Value: 'NoneType' object is not callable

Request information:
GET: No GET data

POST:
name = u'sebastian'

FILES: No FILES data

COOKIES:
csrftoken = 'fWD0OojhrpTLhuxtxb2NF96rVSnKGpWy'
sessionid = 'fccuv36b538pqnulqyhbdsq7ihyrvjo5'
template.html

{% for post in object_list %}
    {{ post.creator }}
    {{ post.created }}
    {{ post.body }}
    <a href="{% groupurl post_answer group discussion_id=discussion.id pk=post.id %}">Answer</a>
    <a class="show_answers" href="{% groupurl post_show_answers group discussion_id=discussion.id post_id=post.id %}">Show</a>
{% endfor %}

<script type="text/javascript">
    $(".show_answers").click(function(e) {
        e.preventDefault();
        var self = $(this);
        ajax_req = $.ajax({
            url: self.attr("href"),
            type: "POST",
            data: {name: "sebastian"},
            success: function(ctx) {console.log(ctx);}
        });
    });
</script>

Django使用ajax发送请求是生成令牌所必需的,如文档中所述

我在此令牌中开发我的应用程序,如下所示

在layout.html中

<html>
    <head>...</head>
    <body>
       <!--the end of the body tag -->
       {% csrf_token %}

       <script type="text/javascript">
           $tagToken = $("{% csrf_token %}");
           var CSRF_TOKEN = $tagToken.find("input[name='csrfmiddlewaretoken']").val();
       </script>
    </body>
</html>

您只需接受django请求即可。

调用
处理程序(请求,*args,**kwargs)
函数中的
时抛出异常,因为您的视图没有
post
方法:

# django.views.generic.base.py:
def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)
您的ajax帖子url与页面url相同:

    ajax_req = $.ajax({
        url: self.attr("href"),
        ...

因此,您应该向视图类添加
post
方法。

关于Ajax上的CSRF保护,我将此Javascript添加到了我的模板中。这就足够了吗?来解释什么是足够使用CSRF的。
$(".show_answers").click(function(e) {
    e.preventDefault();
    var self = $(this);
    ajax_req = $.ajax({
        url: self.attr("href"),
        type: "POST",
        data: {name: "sebastian"},
        beforeSend: function(xhr, settings) {
            if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
                xhr.setRequestHeader("X-CSRFToken", CSRF_TOKEN);
            }
        },
        success: function(ctx) {console.log(ctx);}
    });
});
# django.views.generic.base.py:
def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)
    ajax_req = $.ajax({
        url: self.attr("href"),
        ...