2011-03-02 61 views
1

我有一个桩模型,看起来像这样:用其他帖子的链接替换标题的最佳方式是什么?

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

在你的项目中,你注意到由此造成的减速? – 2011-03-02 19:16:25

+0

@Ignacio Vazquez-Abrams:这仍在开发中,但我已经输入了很多帖子来检查这一点。 – 2011-03-02 19:28:09

+0

在帖子页面加载后,您可以考虑使用Javascript进行操作。只需使用ajax调用(缓存外)来获取帖子标题,然后搜索现有页面并根据需要进行替换。 – Grant 2011-03-02 20:28:56

回答

1

是的,随着帖子数量的增加,这将变得更加昂贵。但是,有一个更好的方法来完成这件事。在考虑用例时,您需要知道确切的帖子标题才能使用。因此,如果您已经浏览了您的网站以获取某篇文章的确切标题,那么您不可避免地也会遇到该文章的网址,对吗?你在做什么是创建一个聪明的机制,将采取原始帖子标题和神奇地呈现为您的网站上现有的帖子的引用,但你应该做的是创建一个明确的引用作为帖子作者,并推迟任何不必要的后期制作,处理。

实现对创建引用的支持,无论是其他帖子还是其他资源,位于您的网站或其他地方。例如,SO使用Markdown通过指向列表[#]: http://path.to的语法[Title][#]创建引用,但还有很多其他的。我知道有很多关于标记语言的问题,有些在Django中专门有编辑,所以我相信你可以解决一些问题并立即将它插入到Django实例中。

+0

但我不可能记得我所做的所有帖子。 – 2011-03-03 12:49:16

+0

只是说你应该采取一些已经提供引用支持的东西,你想做什么,给内容作者而不是系统权力来创建这些引用。当前状态:系统正在构建内容,您的帖子在通过“LinkBack”标签处理后呈现,对于您的系统中存在的每个帖子,每次请求都会对帖子内容进行一次迭代。为了什么?你想要做什么是聪明的,但不直观,我最关心的是它是否足够有用来证明所有这一切。只要保持简单并使用标记编辑器即可。 – 2011-03-03 13:07:57

+0

你是什么意思不直观?你认为用户不会理解链接实际上链接到另一个帖子吗? – 2011-03-03 14:00:29

相关问题