У меня есть модель поста, которая выглядит следующим образом:
class Post(models.Model):
slug = AutoSlugField(populate_from = 'title', unique = True)
title = models.CharField(max_length = 200)
content = models.TextField(blank = True)
is_published = models.BooleanField(default = False)
created_on = models.DateField(auto_now = True)
def get_absolute_url(self):
return reverse('post', args = [self.slug])
Когда я отображаю пост в шаблоне, я хотел бы заменить все упоминания заголовка поста ссылкой на этот пост (например, еслиУ меня есть пост, озаглавленный 'foo', а в контенте других постов 'foo' он будет заменен ссылкой на пост).
Для этого я написал следующий простой тег шаблона (использует django-classy-tags ):
class LinkBack(Tag):
options = Options(
Argument('posts', required = True),
'for',
Argument('content', required = True)
)
def render_tag(self, context, posts, content):
output = content
for post in posts:
output = output.replace(post.title, '<a href="%s">%s</a>' % (post.get_absolute_url() , post.title))
return output
Однако я боюсь, что это замедлит работу моего сайта, когда будет много сообщений.
Есть ли способ оптимизировать этот цикл?
Iможно подключить его к сигналу pre_save, но он будет ссылаться только на существующие сообщения, и мне кажется, что я нарушаю принцип разделения интересов .
Какой лучший способ сделать это?
РЕДАКТИРОВАТЬ:
Должен ли я делать это в работе cron?Таким образом, мне не нужно заниматься проблемой производительности, однако я все еще нарушаю SOC здесь, так как это не проблема данных.