django

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とかいろいろ用意されていて便利だったで、「関数が実行されなかったこと」をテストするのはどうするのかと思って調べた。例えばある…