気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【Django】カスタムフィルタで取得したオブジェクトをwithタグでキャッシュする

・カスタムフィルタでデータを取得し同じテンプレートの中で利用したい場合

モデル定義

以下のモデルが定義されているとする
(UserBlogが中間モデルだが、あえてManyToManyを使わないケース)

# models.py
from django.db import models

# Blogモデル
class Blog(models.Model):
    title = models.CharField(max_length=200)
    url = models.URLField()


# Userモデル
# django.contrib.auth.models.User


# UserBlog
class UserBlog(models.Model):
    user_id = models.CharField(max_length=20)
    blog_id = models.CharField(max_length=20)

カスタムフィルタを定義

# appname/templatetags/custom_filter_package.py

from django.template.defaultfilters import register

@register.filter
def get_blog_by_id(id):
    try:
        obj = Blog.objects.get(pk=id)
        return obj
    except Blog.DoesNotExists:
        pass

ビューでUserBlogを取得

# views.py
from django.template import RequestContext
def any_view(request):
    user = request.user
    user_blog_list = UserBlog.objects.filter(user_id=user.id)
    return render_to_response('blog/list.html', dict(user_blog_list=user_blog_list),
                             RequestContext(request))

テンプレートで利用

{% comment %} blog/list.html {% endcomment%}
{% load custom_filter_package %}

{% for blog in user_blog_list %}

{% with blog.blog_id|get_blog_by_id as blog_obj %}

UserBlogのblog_idを元にカスタムフィルタでBlogのオブジェクトを取得
   {{ blog_obj.name }}
   {{ blog_obj.url }}

{% endwith %}

{% endfor %}

・モデル設計で対応できない場合に利用すると良いか?
(ログテーブルやタイムライン等、複数のモデルにリレーションをはれないケース)
・QuerySet(user_blog_list)に対して各要素にblogオブジェクトがセットできるなら良いのだが、
基本的にはセットできなさそう?