, . , .
templatetags/show_categories_list.py
from django.core.cache import cache
@register.simple_tag
def show_categories_list():
cached = cache.get('CATEGORIES_LIST_CACHE_KEY', None)
if cached is None:
categories = Category.objects.all()
rendered = render_to_string('all_categories.html', {'categories': categories})
cache.set('CATEGORIES_LIST_CACHE_KEY', rendered)
return rendered
return cached
,
all_categories.html
{% for category in categories %}
<h1>{{ category.name }}</h1>
<ul>
{% for sub in category.subcategory_set.all %}
<li>{{ sub.name }}</li>
{% endfor %}
</ul>
{% endfor %}
, - ( , (pre | post) _save):
models.py
class Category(models.Model):
name = models.CharField(max_length=50)
def save(self, *args, **kwargs):
cache.delete('CATEGORIES_LIST_CACHE_KEY')
return super(Category, self).save(*args, **kwargs)
class SubCatergory(models.Model):
parent_category = models.ForeignKey(Category)
name = models.CharField(max_length=100)
def save(self, *args, **kwargs):
cache.delete('CATEGORIES_LIST_CACHE_KEY')
return super(Category, self).save(*args, **kwargs)
, , :
base.html
{% load show_categories_list %}
{% show_categories_list %}
- , , , .
:
http://docs.djangoproject.com/en/1.2/howto/custom-template-tags/#shortcut-for-simple-tags
http://docs.djangoproject.com/en/1.2/topics/cache/#the-low-level-cache-api
http://docs.djangoproject.com/en/1.2/topics/signals/