我有这个博客应用程序,我想提供一个预览按钮,保存表单,然后在新窗口中打开博客。 javascript就是
$(function() {
var current_link = location.href;
$(".preview_button").click(function()
{
$.ajax({
type: "POST",
url: current_link,
data: $("#blog_form").serialize(),
dataType: 'json',
success: function(data)
{
window.open(data,'preview_tab');
$("#reply-message").html('Form saved');
},
error: function(request,error)
{
$("#reply-message").html('Form not saved because error:' + error);
},
});
return false;
});
}
);
我在views.py中将其处理为
if request.is_ajax():
if request.method == 'POST':
author = User.objects.get(pk=author_id)
blog = get_object_or_404(Entry, creator = author, slug = slug)
title = request.POST.get('title', False)
text = request.POST.get('text', False)
tags = request.POST.get('tags', False)
enable_comments = request.POST.get('enable_comments', False)
blog.title = title
blog.text = text
blog.tags = tags
blog.enable_comments = enable_comments
blog.save()
return_message = '/blogs/' + str(blog.creator.id) + '/' + str(blog.slug) + '/' + 'preview/'
return HttpResponse(simplejson.dumps(return_message),mimetype='application/javascript')
return_message
包含预览页面的网址,用于在新窗口中打开它。我有两个问题
编辑:问题原因
第一个问题是因为我在序列化表单时发送了相同的csrf令牌,所以有没有办法可以从序列化函数中删除这个令牌?
第二个问题是因为我在文本区域使用TinyMCE编辑器,当我在编辑器中输入内容时,更改不会反映回实际文本框。如何从文本编辑器中选择文本,而不是从底层(最可能)隐藏文本区域中选择文本
答案 0 :(得分:2)
问题1听起来可能与Django的内置CSRF protection有关。尝试使用Charles或Firebug等工具检查HTTP请求,并检查是否发送了两次相同的CSRF令牌。除非已为视图明确禁用CSRF保护,否则表单提交将在第二次被拒绝,除非令牌已更新。
The docs有一节关于在Ajax代码中处理这个问题。
虽然我不能肯定地说,也许问题2可能与jQuery的选择过程有关,它在序列化时包含哪些字段。来自their docs:
注意:只有“成功控件”被序列化为字符串。没有 由于表单未提交,因此提交按钮值已序列化 使用按钮。对于要包含在表单元素中的值 序列化字符串,该元素必须具有name属性。价值来自 复选框和单选按钮(“radio”或“checkbox”类型的输入) 仅在检查时才包括在内。来自文件选择元素的数据 没有序列化。