2011-03-02 91 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

相關問題