Python温泉2日目
= ネットの調子が悪い。 っていうかLingrの調子が悪いだけか。
開発合宿に必要なもの。 電源タップ。
= スタイルシートのクラスを継承できないかな、という話。 「.comment_bodyも.reply_bodyも.indentを継承」みたいな感じの。
Python Cheese Shop : cssutils 0.9.2a4 を使うとできるか?という話。
jQueryを使ってidでエレメントを取ってclassをつっこんでやるという解決策もあるそうな。
= Pymacs (2006/02/09)
Pymacs frameworkEmacs Lisp と Python の相互乗り入れを可能にする仕組みで、elisp に Python のモジュールを読み込んで使えるようにするもの。
= WSGIってなんだろう。 ミドルウェアらしい。
= twitter.py
= LIタグの頭の点だけ色を変えたい。 方法がわからないのでLIのcolorを指定した上で、liの中にdivを入れて 黒に戻した。
= JavaでEclipseとか使っているとCtrl+Clickでソースがすぐに確認できて便利だよね。 Pythonではモジュールの中のソースコードを確認するの面倒だなぁ、と思っていたけど IPythonなら末尾に「??」ってつけるとソースコードが表示される。
「?」一個ではdocstringとかが表示されるけど、「??」にすればそこがコードに変わる。
In [55]: db.reset_queries? Type: function Base Class:一番下の3行。超便利!String Form: Namespace: Interactive File: c:\python25\lib\site-packages\django\db\__init__.py Definition: db.reset_queries() Docstring: In [56]: db.reset_queries?? Type: function Base Class: String Form: Namespace: Interactive File: c:\python25\lib\site-packages\django\db\__init__.py Definition: db.reset_queries() Source: def reset_queries(): connection.queries = []
= 「コメント本文とコードのどちらかは指定しないといけない」 という制約をフォームに入れるにはどうしたらいいですか。 バリデータを作る必要があるらしい。
バリデータはdjango.core.validatorsにあった。 django.core.validators.[TAB]ってやって一覧を眺めてみると、 RequiredIfOtherFieldNotGivenっていうそれっぽい名前のバリデータがあった。
In [59]: django.core.validators.RequiredIfOtherFieldNotGiven?? Type: type Base Class:なるほどねー。String Form: Namespace: Interactive File: c:\python25\lib\site-packages\django\core\validators.py Source: class RequiredIfOtherFieldNotGiven(object): def __init__(self, other_field_name, error_message=gettext_lazy("Please ente r something for at least one field.")): self.other, self.error_message = other_field_name, error_message self.always_test = True def __call__(self, field_data, all_data): if not all_data.get(self.other, False) and not field_data: raise ValidationError, self.error_message
「コードだけ、コメント本文だけ、の投稿は許すが、両方空っぽなのはダメ」 っていう制約を記述するのは投稿フォームのHTML(やテンプレート)ではなく、 投稿フォームを作っているビュー(コントローラ)でもなく、 モデルの定義の部分。なるほどなー。 考えてみればものすごく当たり前なんだけども、 その当たり前のことがおろそかになっている。
= 今日やること。 1:コード投稿フォーム、2:auth、3:フィード。 フォームに関してはあとタグとレーティングのをつくんなきゃね。
= youtube-dl: Download videos from YouTube.com。 おおっ、これを使えば特定のタグの付いた動画をごっそり収集とかできるわけか。
= ああ、あと言語の追加フォームもいるか。
= django.utils.encoding.smart_unicode
= 机の半分が「tumblr面白い!」残りの半分が「tumblrって何?」という状況(僕は後者)なので、 とりあえずアカウントを作ってみた。
ふむふむ。
= Django でのユーザ認証 : Django オンラインドキュメント和訳。 tumblrとかLingrとかで気が散って、なかなか読み進められなかった。やっと読んだ。 ユーザー管理はDjangoのauthに最初から入っている。 settingも最初から使う設定になっている。
return render_to_response(
'doukaku/comment_form.html',
dict(form=f, parent=parent, cha=cha,
user=request.user, loginform=LoginForm()))
ってやる。LoginFormは下のようなクラス。他のはまあ、他の渡したかった値。
class LoginForm(forms.Form):
signin = forms.BooleanField(label=_("Sign in now?"), required=False)
username = forms.CharField(max_length=50, required=False)
password = forms.CharField(max_length=50, required=False,
widget=forms.widgets.PasswordInput())
で、下のようにしたときに、CommentFormに含まれていないsigninとかはスルーされる。
f = CommentForm(request.POST)
= 下のように書いたら「__init__() got multiple values for keyword argument 'required'」って怒られた。
anonymous = forms.BooleanField(_("Sign in now?"), required=False)
大体何が原因か想像が付くけども、IPythonの練習も兼ねて確認。
django.newforms.BooleanField.__init__??でたソース。(BooleanFieldはFieldの__init__を継承しているのでそっちが出る。偉い!)
def __init__(self, required=True, widget=None, label=None, initial=Noneラベルが一つめの固定引数だと勘違いしていたけども固定引数はないということがわかる。
anonymous = forms.BooleanField(label=_("Sign in now?"), required=False)
これでOK。
= Macはとても熱いので、HappyHackingKeyboardの墨色無刻印を持ち歩く必要がある。
= JUNETは「じぇいゆーねっと」。 JUNET - Wikipedia。
= フィードの大半はゴミなのでフィルタリングが欲しいという意見はあるようだけども、 大半がゴミである以上ネガティブなものに印をつけるために労力を消費するようなシステムはダメなのかも。
= 最高のメタデータは人間。
ただし世の中には役に立つメタデータと役に立たないメタデータがある。
だって。
聞き流しメソッド。
= BooleanField(チェックボックス)って、OFFの状態でPOSTするとFalseが来るんじゃなくて何も来ないのか。
バリデーションに関する情報の入ってないフォームだと、 f.clean()で「cleaned_dataという属性はない」ってエラーになっちゃうのか。
= 部屋に戻ったら僕だけネットにつながらなくて悲しい。
= だいぶできた。 えーと。 サイドバーにユーザの名前くらい出したかったのだけど、 それをやるにはリクエストコンテキストをテンプレートの呼び出し時に渡さないといけないのか。
= 明日の朝ご飯はブルースウィリスだってー。
明日の朝ご飯は8時半で、ブルースウィリスの娘が出るらしい。
デミムーアソースってハンバーグにかけるやつ?
= IEで見るとテンプレートが割と期待はずれになるなぁ。
あと僕のブログをOperaで見ると酷いことになることが判明。