【jQuery1.9.0】 IEで$.ajaxしても更新されない場合の対処法; キャッシュの無効化

$.ajax({
});

つまったところ

 $.ajaxを使うとき、chromefirefoxなどでは正常に処理されるが、IEの動作がなんだかおかしい。 $.ajaxで指定したurl先のデータが更新されていても、success: function(data)で帰ってきたdataは更新されない。IEにくっついてるコンソールにエラーもでない。

 ajaxで指定したurl先に新しいタブでアクセスして$.ajaxをするとしっかりと動く。 キャッシュの問題だった。

 そこでこの問題を解決するために「ie ajax キャッシュ」なんかでググると大量に対処法が出てきた。 皆ここで詰まっているようだ。

一番スマートに見えた解決法

// $.ajaxを呼び出す前に呼び出せるように記述
$.ajaxSetup({
    cache: false, // こいつを追加
});

【Python2.7】【pytz】文字列(unicode)で表された日時をnaiveなdatetime型に直してそれをawareに直す

問題だった場面

Django: "RuntimeWarning: DateTimeField received a naive datetime (YYYY-MM-DD HH:MM:SS) while time zone support is active"

u"2013-03-02T11:10:30"をdatetime型・awareに直す

import datetime
import pytz

# unicodeの日時を作成
time = u"2013-03-02T11:10:30"
# naiveなdatetime型にする
time = datetime.datetime.strptime(time, "%Y-%m-%dT%H:%M:%S")
# awareなdatetime型にする
tz_tokyo = pytz.timezone('Asia/Tokyo')
time = tz_tokyo.localize(time)

【jQuery】一番下までスクロールしたところで関数を実行

jquery_bottomの入手

サンプル

  • 以下のコードは小粋空間様 から引用させていただきました。
  • dataで要素に関連付けて重複読み込みを制御している。
$(window).on('bottom', function() {
    var obj = $(this);
    if (!obj.data('loading')) {
        obj.data('loading', true);
        $('#image').html('');
        $.ajax({
            url: "test.html",
            cache: false,
            success: function(html){
                $("#hoge").append(html);
                $('#image').html('');
               obj.data('loading', false);
            }
        });
    }
});

【jQuery】TwitterやFacebookのように「…分前」と日本語で表示する

Livestampjs を使う

日本語で使いたい場合は以下を参考に

【jQuery】.focus()が機能しない時の解決法

問題

  • .focus()してるのにカーソルがテキストエリアなどに移動しない

解決法

setTimeoutを使った

setTimeout(function(){
    $(this).focus();
}, 0);

参考

【Django1.4】Djangoでモデルのフィールドを途中で追加・変更・削除する方法

したいこと

一度モデル作ってsyncdbしたが、やっぱり途中で色々変えたくなった

解決策の例

  1. テーブルを削除して作り直し、manage.py syncdb
  2. ALTER文で直接テーブルを書き換える

ちなみに1の方法だとデータが消えてしまうので、とっても手軽ではあるが公開前にしか使えない。(削除する前にバックアップをとって…というやり方も見つけた。)

ALTER文で直接テーブルを書き換える手順

  • app名はtwitter
  • テーブル名はtwitter_status(dbshellで\dで確認。'appname_modelname'の形)
  • 例として、もう作ってしまったテーブルにCharFieldとIntegerFieldを追加する。
  • 環境はPostgreSQL

流れ

  • models.py を修正
…
retweet_count = models.IntegerField(default=0)
in_reply_to_status_id_str = models.CharFields(max_length=20, blank=True)
…
  • しなくてもいいが、manage.py sql twittersql文を確認(最終的にフィールドを以下の形にする)
…
"retweet_count" integer NOT NULL,
"in_reply_to_status_id_str" varchar(20) NOT NULL,
…
  • manage.py dbshellでALTER文をNULLを許容する形で発行
ALTER TABLE twitter_status ADD retweet_count integer;
  • デフォルト値を与える
ALTER TABLE twitter_status ALTER COLUMN retweet_count SET DEFAULT 0;
  • UPDATE文で追加のフィールドに値を与える(既存のレコードにはデフォルト値が与えられていない)
UPDATE twitter_status SET retweet_count=0 WHERE retweet_count is NULL;
  • ALTER文でNOT NULLをSET
ALTER TABLE twitter_status ALTER COLUMN retweet_count SET NOT NULL;
  • retweet_countが追加できた。
  • 今度はin_reply_to_status_id_strを追加する。やることは全く一緒。
  • NULLを許容する形でADD
ALTER TABLE twitter_status ADD in_reply_to_status_id_str varchar(20);
  • default値の設定
ALTER TABLE twitter_status ALTER COLUMN in_reply_to_status_id_str SET DEFAULT ''; 
  • UPDATE
UPDATE twitter_status SET  in_reply_to_status_id_str='' WHERE in_reply_to_status_id_str is NULL;
  • SET NOT NULL
ALTER TABLE twitter_status ALTER COLUMN in_reply_to_status_id_str SET NOT NULL;
  • in_reply_to_status_id_strの追加完了

【Django1.4】TwitterやFacebookみたいに時刻を何秒前、何分前、何時間前、と表示する

現在から時刻を引いて何秒前、何分前、何時間前と出力する何かを自作するのはなんとなく面倒なので、 そのような機能を持ったフィルターはないかと探した。

timesince は微妙

一応何もしなくてもtemplateに例えば

{{ rows.created_at|timesince }}

と記述すれば今からの時間を勝手に計算して、勝手に整形して出力してくれるが、表示がなんとなくわかりづらい。あと何秒前かがない。

timesinceよりはdjango.contrib.humanize

humanizeはデータを人間に見やすくするフィルターのセットだ。

使い方

実際に使う

naturaltimeがtimesinceの上位互換だ。

...
{% load humanize %}
...
{{ rows.created_at|naturaltime }}
...

ちゃんと日本語で表示してくれるから嬉しい

jQueryを使ってリアルタイムに分前を表示