MNUにてインターンをさせていただいています、
豊橋技術科学大学の近藤です。
現在作成中のアプリケーションで行った作業の一部をまとめてみました。
1つのインスタンスにつき2行を割り当てて、
2行目の表示、非表示を切り替えるようにするため、
無理やりコーディングしてみました。
くくったメッセージを表示させているだけです。
後はdjango.contrib.admin.template.change_list.htmlを
オーバーライドして、javascriptを追加するだけで動作はしますが、
このHTMLをpythonのコードとして記述するのは気持ち悪い。
よく考えたらTemplateに記述して読み込めばよいと気付きました。
render_to_stringなる便利なものがあるのでそちらを利用。
forタグを使って、何度もincludeできるが、
別の名前の変数を使ってincludeして出力を行いたい場合に遭遇。
リファレンスによるとwithタグを使うと可能。
探していたら、別の記述方法があった。includeタグ内にwithを記述できる。
celeryはCPUのコア数に応じて同時に処理する数を設定しているのが原因。
django-celeryで固定値で設定するには、settings.pyに
celery実行時に -c オプションで設定もできる。
設定すると、起動時のアスキーアートの横の設定値が
豊橋技術科学大学の近藤です。
現在作成中のアプリケーションで行った作業の一部をまとめてみました。
Adminサイトの表示変更
AdminサイトのChangeListをいじっている際に、1つのインスタンスにつき2行を割り当てて、
2行目の表示、非表示を切り替えるようにするため、
無理やりコーディングしてみました。
def detail(self, obj):
pre = u'<pre>%s</pre>' % obj.message
span = len(self.list_display) - 1
msg = u'<th >Message</th><td colspan="%s">%s'
% (span, pre if obj.message != '' else '')
detail = u'<button class="btn btn-info toggler_row_btn" id="%s" type="button
詳細</button>' % (obj.pk)
button = u'<div class="btn-group btn-group-sm" role="group">%s</div>' % (detail)
return u'%s</td></tr><tr class="toggler_row" id="%s"><td></td>%s'
% (button, obj.pk, msg)
detail.allow_tags = True
単純に、行を閉じて新しい行を開いてpreタグでくくったメッセージを表示させているだけです。
後はdjango.contrib.admin.template.change_list.htmlを
オーバーライドして、javascriptを追加するだけで動作はしますが、
このHTMLをpythonのコードとして記述するのは気持ち悪い。
よく考えたらTemplateに記述して読み込めばよいと気付きました。
<button class="btn btn-info toggler_row_btn" id="{{ object.pk }}" type="button">
<span class="glyphicon glyphicon-chevron-down"></span> 削除
</button>
</td></tr>
<tr class="toggler_row" id={{ object.pk }}>
<td></td> {# CheckBoxの分 #}
<th>Message</th>
<td colspan="{{ colspan }}">
{% if object.message %}<pre>{{ object.message }}</pre>{% endif %}
</td>
</tr>
最初はTemplateをだして、Render呼んで...としていましたが、render_to_stringなる便利なものがあるのでそちらを利用。
from django.template import Context
from django.template.loader import render_to_string
from django.template import TemplateDoesNotExist
span = len(self.list_display) - 1
try:
cont = Context({'object': obj, 'colspan': span})
return render_to_string(
'hoger/admin/change_list_detail.html', cont)
except TemplateDoesNotExist:
return ''
detail.allow_tags = True
これで、可読性が上がったと思います。Templateのインクルードを別変数で
Template内で別のテンプレートを呼び出す際には、includeタグを使う。forタグを使って、何度もincludeできるが、
別の名前の変数を使ってincludeして出力を行いたい場合に遭遇。
リファレンスによるとwithタグを使うと可能。
{% if object2 %}
{% with object=object2 %}
{% include "hoge/detail.html" %}
{% endwith %}
{% endif %}
ただ、一回の呼び出しに3行使うのは気持ち悪いので他の方法を探していたら、別の記述方法があった。includeタグ内にwithを記述できる。
{% if object2 %}
{% include "hoge/detail.html" with object=object2 %}
{% endif %}
Celeryの同時実行数
VirtualBox内のLinux上でceleryを使ってるが、ジョブの消費がシリアルだった。celeryはCPUのコア数に応じて同時に処理する数を設定しているのが原因。
django-celeryで固定値で設定するには、settings.pyに
CELERYD_CONCURRENCY = 16とする。
celery実行時に -c オプションで設定もできる。
設定すると、起動時のアスキーアートの横の設定値が
-------------- celery@localhost.localdomain v3.1.17 (Cipater) ---- **** ----- --- * *** * -- Linux-3.17.4-301.fc21.x86_64-x86_64-with-fedora-21-Twenty_One -- * - **** --- - ** ---------- [config] - ** ---------- .> app: default:0x7f741e46d310 (djcelery.loaders.DjangoLoader) - ** ---------- .> transport: redis://127.0.0.1:6379// - ** ---------- .> results: djcelery.backends.database.DatabaseBackend - *** --- * --- .> concurrency: 16 (prefork) -- ******* ---- --- ***** ----- [queues] -------------- .> celery exchange=celery(direct) key=celeryとなり、concurrencyの値で確認できる。
コメント
コメントを投稿