先日のメモで書いた内容を実装してみました。 (http://kimihiro-n.appspot.com/show/3025) もう「戻る」を押しても安心です。
entry = models.Blog(public=False) entry.save() return_url = reverse('blog_edit',args=[entry.key().id(),]) return HttpResponseRedirect(return_url)
/blog/views.pyより抜粋
IDが先に付与されたので、記事下書き中にも保存できそうだと思い、 編集中に一定タイミングで自動保存する機能をつけてみました。 編集中に記事が消える事故防止策です。
まずAjax用投稿先の用意。
(r'^edit/(\d*)', 'edit',{},'blog_edit'), (r'^edit_ajax/(\d*)', 'edit',{'ajax':True},'blog_ajax_edit'),
if ajax: return HttpResponse("Success to save.")
残るはフロントのJavascriptだけです。
$(function(){ $('#id_body').addClass('ckeditor'); $('#id_more').addClass('ckeditor'); setInterval(function(){ var data = $('#id_title').val(); $.ajax({ type: "POST", url: "{% url blog_ajax_edit entry_id%}", data: { "title": $("#id_title").val(), "body": CKEDITOR.instances.id_body.getData(), "more": CKEDITOR.instances.id_more.getData(), "category": $("#id_category").val(), "public": $("#id_public").val(), }, success: function(result){ var date = new Date() $('#ajax_status').text(date.toLocaleString() +": " + result); }, dataType: "text" }); },30000); });
setIntervalを使用して一定間隔ごとに自動でPOSTしています。 ひとつ躓いたのがCKEditorのフォームから内容を取得する部分です。 普通にjQueryのval()で取ろうとしたら取れませんでした。 CKEditorの内部で色々置き換えが発生しているようです。
http://tetsuwo.tumblr.com/post/12457516199/ckeditor そこでこんな記事を発見。 CKEDITOR.instances.id_body.getData(), のような形で値がとれるみたいです。 取ってきたHTMLをそのままPOSTしてます。 あとは帰ってきたレスポンスを端っこの方に出力して 下書きの保存状況を見れるようにしたりとか。