我有一个桩模型,看起来像这样:用其他帖子的链接替换标题的最佳方式是什么?
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
不过,我担心这是要我的网站慢下来的时候有很多的职位。
有没有一种方法来优化该循环?
我可以将它与pre_save信号挂钩,但这只会链接到现有的帖子,感觉就像我违反了separation of concerns原则。
最好的办法是什么?
编辑:
我应该在cron工作中这样做吗?这样我就不需要处理性能问题,但是我仍然在这里违反SOC,因为这不是数据的问题。
在你的项目中,你注意到由此造成的减速? – 2011-03-02 19:16:25
@Ignacio Vazquez-Abrams:这仍在开发中,但我已经输入了很多帖子来检查这一点。 – 2011-03-02 19:28:09
在帖子页面加载后,您可以考虑使用Javascript进行操作。只需使用ajax调用(缓存外)来获取帖子标题,然后搜索现有页面并根据需要进行替换。 – Grant 2011-03-02 20:28:56