unittestのmockオブジェクトを使うときにいつも迷うのでメモ。
特に、深い階層にある何かをモックしようとすると、僕は今何をしてるんだろう、、、みたいな状況になったりする。
return_valueとかside_effectとかが混乱に原因になっているように思う。
続きを読むunittestのmockオブジェクトを使うときにいつも迷うのでメモ。
特に、深い階層にある何かをモックしようとすると、僕は今何をしてるんだろう、、、みたいな状況になったりする。
return_valueとかside_effectとかが混乱に原因になっているように思う。
続きを読む今の会社で働き始める前、djangoで管理コマンドを作れることをぼくは知らなかった。
今は、普通にdjangoで作られたアプリケーションを触るし、普通に管理コマンドが作れることは知ってるし、普通に作る。
だけど、入社する前にdjangoのチュートリアルをやってただけだと、全然知らなかった。
多分、ぼくと同じような人は、結構世の中にいるような気がするので、簡単に紹介しよう。
ドキュメントは、ここをみると良いと思う。
カスタム django-admin コマンドの実装 | Django documentation | Django
ドキュメントを読んだた書いてあるけど、
myproject/myapp/management/commands/my_custom_command.py
みたいな場所に作る。なぜ、こんなに階層が深いのかなぞだと思ってる。
こんなファイルが、 my_custom_command.py
だとする。
from django.core.management.base import BaseCommand class Command(BaseCommand): def handle(self, *args, **options): print('hello command')
これで、myappがINSTALLED_APPに入っていたら、my_custom_commndが使えるようになる。
$ python manage.py my_custom_commnd hello command
パラメータとかも渡せる。詳しくはドキュメントを読むと良さそう。
django adminの一覧でカラムを増やしたい、と思う時はよくある
なんか、毎回同じようなことを検索して、djangoのドキュメントを探して自分で実行して確かめてる。というわけで、メモする。
例えば、こういうモデルがある。
class MyModel(models.Model): title = models.CharField(max_length=10) text = models.CharField(max_length=10) rank = models.IntegerField() def __str__(self): return self.title
そこに、以下のようなadmin定義をする。
@admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): fields = ('title', 'text', 'rank')
するとMyModelの一覧は、titleがずらっと並ぶ。rankも見たいよね。という時はある。 そういう時は、list_desplayを定義する。
@admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): fields = ('title', 'text', 'rank') list_display = ('title', 'rank')
それだけ。
詳しくはドキュメントを。
djangoを触っていて、エラーが出た。
Djangoのバージョンは、1.11
以下が、エラーメッセージ。
Unknown field(s) (myfiled) specified for MyModel. Check fields/fieldsets/exclude attributes of class MyModelAdmin.
myfiledとかMyModelAdminとかは、良い感じに目で置換してもらいたい。
admin画面に登録した後に、django adminで詳細ページを開こうとした時に出るエラー。
原因は、filedsのタイポだった。
例えば、django adminに登録する時、以下のようなコードがある。
@admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): fields = ('title', 'text')
それを、例えば、以下のように書いていて、
@admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): fields = ('myfiled', 'text')
myfiledなんてフィールドがmodelに定義されてなかったら、先頭のエラーが出る。