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の値で確認できる。
コメント
コメントを投稿