ちょっとした覚え書き

書いておかないと忘れそうなのでメモ。Django 0.96 用。

Apache での認証に Django のユーザデータベースを使う

http://michilu.com/django/doc-ja/apache_auth/
できなかった。入力してもパスしない。
やりたいのは、 Subversiontrac の認証を Django で一元管理すること。
Django も Active Directory に認証を任せているので、まあいいんだけど。

newforms を使った既存オブジェクトの変更

obj = Sample.objects.get(pk=id)
cls_form = forms.form_for_instance(obj)
form = cls_form(request.POST.copy()) #これ重要
if not form.erros:
    form.save()

form生成時にPOSTデータを渡しておかないと、変更のつもりが追加になる。
気付いてみれば当たり前だけど、ajaxで非同期にデータを追加してると気付かなかった。

settings.py のちょっといい書き方

settings_local を使った設定の切り分けもいいけれど、個人的にはこっちが衝撃的だった。

REVIEWBOARD_ROOT = os.path.abspath(os.path.split(__file__)[0])

python使いには当たり前なのか?

今はこれを応用して、ソースをどこに置いてもいい感じにしている。
デフォルトでこうなっていてほしいくらい。

import os
PROJECT_ROOT = os.path.abspath(os.path.split(__file__)[0])
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = os.path.join(PROJECT_ROOT, 'db/djangoproject.db')
TEMPLATE_DIRS = (
    os.path.join(PROJECT_ROOT, 'templates')
)

違うテーブルのフィールドでソートするには

別のテーブルのフィールド値で整列させる場合,テーブル名をドット表記で指定します:
Entry.objects.order_by('blogs_blog.name', 'headline')

http://michilu.com/django/doc-ja/db-api/#order-by-fields

とあるが、

Entry.objects.select_related().order_by('blogs_blog.name', 'headline')

こうしないと、blogs_blog.name なんてカラムないよってエラーになる。

スタッフだけに見せたい場合は

django.contrib.admin.views.staff_member_required デコレータを使う。


特定の権限で制限したい場合は
django.contrib.auth.permission_required デコレータでいいのかな?

管理画面で初期値をセットするには

クエリパラメータを渡してやればいいだけだった。ManyToManyのフィールドは , (カンマ)で区切る。

/admin/appname/modelname/add/?fieldname1=fieldvalue1&fieldname2=fieldvalue2,fieldvalue3