読者です 読者をやめる 読者になる 読者になる

DjangoのFormsetで少なくとも1つは入力させる入力チェック

FormsetのcleanでraiseしたValidationErrorはnon_form_errorで取得できる

Djangoのsyncdbでユーザーを作成しない

syncdbするときに、ユーザーがいらないのにいちいちnoを打つのが面倒。 --noinputオプションつければ、ユーザーを作成しない $ python manage.py syncdb --noinput ちなみに、django 1.7ではsyncdbは非推奨になっていて、代わりにmigrateを使うことが推奨さ…

Django Queryset AggregationでDBによって結果が異なるケース

DBがmysqlかsqliteかによって、テストが落ちたり成功したりするケースがあったので原因をメモしておく Max OSX 10.9.4 MySQL 5.5.20 python 2.7.5 django 1.7 MySQL-python 1.2.5 DateTimeFieldを持つモデル from django.db import models class Entry(model…

ファイルアップロードでファイル名が重複したときの挙動

最近djangoでファイルアップロードが絡む処理を実装したとき、同一ファイル名に対する挙動が以前と変わっていることに気づいた。 以前はファイル名が重複したときxxxx_1.txt、xxxx_2.txtといった感じで連番が振られていたが、現在はxxxx_8kkVNQf.txtのように…

DjangoからAzureストレージにBLOBを保存したときのメモ

django-storagesにAzure用Storageクラスが用意されているので使ってみる。参考:Azure Storage ― django-storages 1.1.8 documentation DEFAULT_FILE_STORAGE = 'storages.backends.azure_storage.AzureStorage' AZURE_ACCOUNT_NAME = "" AZURE_ACCOUNT_KEY …

AppRegistryNotReady: Models aren't loaded yet.

Pycharmの「Run manage.py Task」から「shell」を起動してmodelsをimportしたら以下のエラーになった AppRegistryNotReady: Models aren't loaded yet.Djangoのバージョンは1.7。 runserverしてアプリを動かす分にはエラーにならないし、Pycharmを通さずTerm…

Formのエラー文字列を辞書で取得する

ファイルアップロードのテストでMEDIA_ROOTを差し替える

MEDIA_ROOTにファイルが置かれるようなテストを実行後、ファイルを削除することを考えていた。 いろいろ方法ありそうだけど、こんな感じでよさそう。

view関数のテストでjsonをPOSTする

def test_xxxx(self): data = {} # postするデータ res = self.client.post('/path/to/api', content_type='application/json', data=json.dumps(data)) view関数側ではrequest.bodyをjson.loadsしてdataを受け取る def xxxx(request): data = json.loads(re…

Djangoで日本語名のファイルアップロード時にエラー

ひさびさにUnicodeEncodeErrorなんてものを見た気がする。 UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-19: ordinal not in range(128) 以前も同じようなことがあって、そのときはgunicornを起動している環境の環境変数でLC_…

Djangoでブラウザを閉じたらセッションを無効にする

settings.py SESSION_EXPIRE_AT_BROWSER_CLOSE = True Set-Cookieヘッダで、sessionidにMax-Ageとexpiresが設定されなくなる ただこれだと全体的な設定になるのでログイン時にログインを維持するかどうかを、チェックボックスで確認するような場合には対応で…

Django+mysqlでDateFieldを月ごとに集計する。

関連 : mysqlでdate型を月毎に集計する - brainstorm昨日SQLで書いたやつをDjangoのquerysetで書けるかどうかいろいろ試してみた。実行したいSQL select DATE_FORMAT(event_date, "%Y%m") as ym, count(id) as count from event group by DATE_FORMAT(event_…

djangoのQuerySetでグルーピングしてカウントする

こんなテーブルがあるとする CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `prefecture` varchar(3) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`) ); id name prefecture age 1 田中たけし 千葉 18 …

FormFieldのlabel属性にhtmlタグを入れる

そんなことをしなきゃいけないケースはほとんどないけど一応メモしておく。試しに<br/ >を入れてみる class SampleForm(forms.Form): sample_field = forms.CharField(label=u"abc<br/ >xyz") これだとhtmlがエスケープされるので改行にならない from app.student.forms </br/></br/>…

波括弧のエスケープ

djangoでフォームをレンダリングするとき、{{ form }}って書ければ楽なんだけど、デザインの都合でそうはいかない場合もある。 django shellでデザインになるべく合わせた雛形を出力して、コピペして細かいところを修正するとよいかも。 >>> form = SampleFo…

フォームフィールドのrequired属性にテンプレートからアクセスする

フォームの必須の入力フィールドになんらかのマークを付けたい場合、以下みたいにハードコーディングしていると、フォームの定義が変わったときにテンプレートも修正しなければいけなくなる。 <div> <label for="{{ form.name.label }}">{{ form.name.label_tag }} (必須)</label> {{ form.name.error }} {{ f</div>…

Djangoのテンプレートで、キーに変数を指定して辞書にアクセス

context_dataに辞書が渡されていて、テンプレートでアクセスする例views.py from django.views.generic import TemplateView class HomeView(TemplateView): template_name = 'sample/home.html' def get_context_data(self, **kwargs): ctx = super(HomeVie…

djangoのListViewで検索結果をページングするときのあれこれ

適当に作ったサンプル from django.views.generic import ListView from items.forms import ItemSearchForm from items.models import Item class ItemListView(ListView): model = Item paginate_by = 10 def __init__(self, **kwargs): super(ItemListVie…

DjangoでFormのFieldの属性を動的に変更するとか

ModelChoiceFieldの選択肢を動的に変えたいとき、__init__でself.fieldsを参照して入れ替えることができる class SelectForm(forms.Form): item = forms.ModelChoiceField(queryset=Item.objects.none()) def __init__(self, category, *args, **kwargs): su…

djangoのmethod_decorator

今日はdjangoのmethod_decoratorを使う機会があったのでソースを読んでいた。 Django Utils | Django documentation | Django djangoのClass Based Viewにlogin_requiredやcsrf_protectなどの関数デコレータをかけるために用意しているようだ。 Introduction…

DjangoのFormとテンプレート描画

web開発案件では、アプリが出力する画面のイメージが顧客からhtmlで提供されることがある。一方、djangoのFormライブラリはform部品のhtmlを出力することができるが、顧客提供のhtmlと一致しないケースはよくあると思う。 こんなふうにかければ楽なんだけど…

django shellで実行されるsqlを表示する

QuerySetでちょっと複雑な条件を書いてるときとか、sqlがどうなってるのか確認したい場合がある。 そんなときはdjango-extensionsのshell_plusの--print-sqlオプションを使うと便利。 モデルもpreloadしてくれるのでいちいちimportしなくていい python manag…

DjangoでAbstractUerを使ったときのエラーをメモ

見慣れないエラーを出したのでメモしておく。django.contrib.auth.models.AbstractUserを継承したモデルを作成設定ファイルのミスなどでAUTH_USER_MODELを指定していない場合以下のエラーがでる。ないとGroupやUserPermissionとUserの関連テーブルが重複する…

Django 1.7aのForm.add_errorを使ってみる

Djangoのformで複数フィールドにまたがるバリデーションをかけたい場合は、cleanメソッドに処理を書く。 例 # coding=utf-8 from django import forms from django.core.exceptions import ValidationError class PasswordConfirmForm(forms.Form): password…

Django/QuerySetのvalues_listでレスポンスをフラットにする

>>> User.objects.values_list('id') [(1L,), (2L,), (3L,)] flat=Trueで。 >>> User.objects.values_list('id', flat=True) [1L, 2L, 3L] 同じことはリスト内包表記を使ってできるけどいまいち >>> [u.id for u in User.objects.all()] [1L, 2L, 3L]

Djangoのテストで実行されたsqlを確認する

# coding=utf-8 from django.test import TestCase from django.db import connection from apps.models import Person class TestSample(TestCase): def test_sample(self): connection.use_debug_cursor = True connection.queries = [] # do something Pe…

Class Based Viewのシンプルな実装「Django Vanilla Views」

Django Vanilla Views - Beautifully simple class based views DjangoのClass-Based-Viewは継承関係が複雑で、ちょっとソースを見てフックポイントを確認したいっていうときに結構めんどくさい。Django Vanilla Viewsは機能はそのままで実装をシンプルにし…

django-devserver を試す 2

ちょっとずつしか試せてませんが。 sqlを省略しない デフォルトだとログに出力されるsqlはカラムが省略されます。以下の設定を追加することで省略されなくなります。 DEVSERVER_TRUNCATE_SQL = False ajaxレスポンスをログ出力する AjaxDumpModuleを追加 DEV…

django-devserver を試す

django標準のrunserverを置き換えて、開発時に便利な機能を使えるようにしたものらしい。django-devserver 0.6.2 : Python Package Index インストール pip install git+git://github.com/dcramer/django-devserver#egg=django-devserver 設定。INSTALLED_AP…

mockを使って「関数が実行されないこと」をテストする

mockを使ってテスト書いてて、「関数が実行されたこと」をテストするのに、assert_called_withとかassert_called_once_withとかいろいろ用意されていて便利だったで、「関数が実行されなかったこと」をテストするのはどうするのかと思って調べた。例えばある…

DeprecationWarning: You have no filters defined on the 'mail_admins' logging handler

こんなWarningが出てたので調べた。 DeprecationWarning: You have no filters defined on the 'mail_admins' logging handler: adding implicit debug-false-only filter. See http://docs.djangoproject.com/en/dev/releases/1.4/#request-exceptions-are-…

djangoでfactory_boyを使ってみる

軽くさわってみて雰囲気をみてみたfactory_boy ― Factory Boy 2.1.2 documentation rbarrois/factory_boy インストール $ pip install factory_boyこんなエラーがでたけど、pip install -U setuptoolsしてリトライしたら成功した pkg_resources.VersionConfl…

Djangoのdatabase routerでImproperlyConfigured "cannot import name connection"

Djangoのdatabase routerはread/writeするdbを指定できる機能 Multiple databases | Django documentation | Django ドキュメントを参考にして書いていて、ある特定のモデルの場合は、特別なDBをみるみたいなことをやろうとしたら以下のエラーになった。 dja…

django-mobilityを試す

アクセスした端末のUserAgentによってレスポンスを変えたい場合に使えるライブラリ インストール pip install django-mobility 設定 ドキュメントに書いてあるままsettings.pyに設定を書く ただの値はデフォルト値なので、このまま使う場合は書かなくてもい…

datetimeをLast-ModifiedやIf-Modified-Sinceの書式に変換 2

datetimeをLast-ModifiedやIf-Modified-Sinceの書式に変換 - brainstormdjangoで用意されてた。 >>> from datetime import datetime >>> from django.utils.http import parse_http_date, http_date >>> now = datetime.now() # datetimeをepochタイムにする…

django-admin2を試した

インストール pip install django-admin2 設定 djadmin2と依存ライブラリをINSTALLED_APPSに含めるsettings.py INSTALLED_APPS += ( 'djadmin2', 'rest_framework', # for the browsable API templates 'floppyforms', # For HTML5 form fields 'crispy_form…

DjangoでModelに設定したmax_lengthの値をFormのmax_lengthに指定する

ModelFormを使えば、何もしなくても設定されるはずだけど、明示的にFormFieldを指定しなおしている場合とか、forms.Formを使ってる場合とかは、max_lengthを2箇所に書くことになってしまう。 解決方法を調べてたら、Model側のmax_lengthの値を取得してFormFi…

Djangoでlorem ipsumを生成する

django.contrib.webdesignにlorem ipsumを生成するテンプレートタグが用意されていることを知った。このパッケージには今のところ他に機能はないようだ。settings.py INSTALLED_APPS += ( 'django.contrib.webdesign',) html {% load webdesign %} <h2>lorem 3 p</2>…

DeprecationWarning: django.conf.urls.defaults is deprecated; use django.conf.urls instead

こんなwarningがログにでてたんですが、django.conf.urls.defaultsを使ってる箇所が見当たらない。 DeprecationWarning: django.conf.urls.defaults is deprecated; use django.conf.urls insteadと思ったらdjango-debug-toolbarが使っていた。debug_toolbar…

PASSWORD_HASHERSのベンチマーク

BCryptPasswordHasher、PBKDF2PasswordHasher、PBKDF2SHA1PasswordHasherが遅い。その他は桁違いに速いが、後方互換性のために実装が用意されているだけで、セキュリティ上使うべきでないとコメントされている。 ## user sys total real PBKDF2PasswordHashe…

PBKDF2

Djangoではユーザーのパスワードをハッシュでdbに保存します。django1.3では単純にsalt+sha1でした。 def set_password(self, raw_password): if raw_password is None: self.set_unusable_password() else: import random algo = 'sha1' salt = get_hexdige…

Djangoでテストを速くするためにいろいろやってみた

4分程度かかってたテスト実行を速くするためにいろいろやってみたときのメモ まず対応前 $ python manage.py test app --settings=settings.test Creating test database for alias 'default'... .........................................................…

Djangoのパスワードリセットでtokenの一致確認に使われるconstant_time_compare

こんな関数なんですが、なんで文字列の==でなく、わざわざこんなことしてるんでしょうか? djangoの1.3の頃は普通に比較してたと思うんですが。 django.utils.crypto.py def constant_time_compare(val1, val2): """ Returns True if the two strings are eq…

djangoのパスワードリセット機能でURLに付与されるtokenについて調べたメモ

djangoのパスワードリセット機能は、以下のようなURLを含むメールを送って、アクセスしたユーザーが新しいパスワードを入力するものです。 http://localhost:8000/auth/password_reset_confirm/2-3hw-4c194a11e6bda0c44f5c/ パスの最後のランダムな部分はそ…

DjangoのFormのcleanメソッドの呼び出し順

DjangoのFormでis_validが呼ばれたときの処理を読んでたのでメモ まず、データが渡されたFormのインスタンスでis_validが呼ばれた場合、内部でfull_cleanがよばれる。 該当の箇所 django/forms/forms.py def _get_errors(self): "Returns an ErrorDict for t…

logutilsのTestHandlerでログ出力をテストする

logutilsにTestHandlerというクラスが用意されてるので、「view関数で出力されたログをテストする」方法を試してみました。vinay.sajip / logutils ― Bitbucket 適当にview関数を用意。処理中にwarningログを出力する。 views.py import logging from django…

Southのschemamigrationでエラー

schemamigrationで以下のエラーになりました。 ! Cannot freeze field 'apps.person.shirt_size' ! (this field has class books.models.ShirtSizeField) ! South cannot introspect some fields; this is probably because they are custom ! fields. If th…

DjangoでRadioSelectのラジオボタンをバラバラに表示する

以下のようなFormがあって、ラジオボタンを表示するときは from django.forms import RadioSelect from django import forms class RadioSelectSampleForm(forms.Form): beatles = forms.ChoiceField(choices=(('ringo', 'Ringo'), ('george', 'George'), ('…

django.utils.dates.MONTHS

django.utils.dates.MONTHSってのがあるのを知った MONTHS = { 1:_('January'), 2:_('February'), 3:_('March'), 4:_('April'), 5:_('May'), 6:_('June'), 7:_('July'), 8:_('August'), 9:_('September'), 10:_('October'), 11:_('November'), 12:_('Decembe…

CreateViewでモデルのユーザー属性にログインユーザーを設定する

formにhiddenでユーザーidを設定しておくのを見たことがあるんですが、それだとhiddenの値を改ざんされる場合があります。djangoのドキュメントにちゃんとやり方が書いてあって、form_validで行うのが良いようです。 # views.py from django.views.generic.e…