我有一个看起来像这样的帖子模型:
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,因为这不是数据的问题。
答案 0 :(得分:1)
是的,随着帖子数量的增加,这将变得更加昂贵。但是,有一个更好的方法来完成这项工作。当您考虑用例时,您需要知道确切的帖子标题才能使用。因此,如果您已浏览网站以获取某些帖子的确切标题,那么您不可避免地会遇到帖子的网址,对吧?你所做的是创建一个聪明的机制,将采用原始帖子标题并神奇地将它们作为对你网站上现有帖子的引用,但你应该做的是创建一个明确的引用作为帖子作者并推迟任何不必要的帖子 - 处理。
实施支持,以创建位于您网站或其他位置的引用,无论是其他帖子还是其他一些资源。例如,使用Markdown通过指向列表[Title][#]
的语法[#]: http://path.to
创建引用,但还有许多其他。我知道有很多关于标记语言的问题,有些是专门用Django编写的,所以我确信你可以解决一些问题并立即将它插入你的Django实例。