Javascript Django Ajax jQuery URL
我有下面的模板文件,我将在其中执行一个ajax请求。如果单击模板中的show链接,jquery函数将被执行,然后在浏览器的开发者控制台中收到以下错误消息: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
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"),
...