スキップしてメイン コンテンツに移動

インターン(その12)

MNUにてインターンをさせていただいています、
豊橋技術科学大学の近藤です。

現在作成中のアプリケーションで行った作業の一部をまとめてみました。

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の値で確認できる。

コメント

このブログの人気の投稿

はじめまして!

はじめまして!
株式会社MNUで新しくブログを始めます。
主に、プログラムに関する技術的なことを中心に社員が持ち回りで書いていきます。
皆様のお役に立てれば幸いです。

どうぞ、これからよろしくお願いします。


ここから下はコードを表示するサンプルです。

int x = foo(); /* This is a comment This is not code Continuation of comment */ int y = bar(); // This is line 4. foo(); bar(); baz(); boo(); far(); faz(); shfor target do WORKDIR=$(mktemp -d "$EXTRACTHOMEDIR"/XXXXXX) case "$target" in *.[Tt][Gg][Zz]|*.[Tt][Aa][Rr].[Gg][Zz]|*.[Tt][Aa][Rr].[Zz]) tar vzxf "$target" -C "$WORKDIR" move_to_currentpath "$WORKDIR" "$target" ;; *.[Tt][Bb][Zz]|*.[Tt][Aa][Rr].[Bb][Zz]2) tar vjxf "$target" -C "$WORKDIR" move_to_currentpath "$WORKDIR" "$target" ;; *.[Gg][Zz]) gzip -d "$target" move_to_currentpath "$WORKDIR" "$target" ;; *.[Zz][Ii][Pp]|*.[JjWw][Aa][Rr]) check_required_program unzip /usr/p…

液晶ディスプレイのパネル構造に関する特許を取得しました

はじめまして、MNUの伊東です。
先日、液晶ディスプレイのパネル構造に関する特許を出願し、無事審査を通りましたのでこれからそれに関する技術的ポイントについて記載して参りたいと思います。