2011-03-02 3 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 원칙을 위반하고있는 것처럼 느껴집니다.
가장 좋은 방법은 무엇입니까?

편집 :
크론 작업에서이 작업을 수행해야합니까? 그렇게하면 성능 문제를 처리 할 필요가 없지만 데이터의 문제가 아니기 때문에 SOC를 여전히 위반하고 있습니다.

+0

프로젝트에서이 문제로 인해 속도가 느려졌습니다. –

+0

@Ignacio Vazquez-Abrams : 아직 개발 중이지만이를 확인하기 위해 많은 게시물을 입력했습니다. –

+0

게시 페이지가로드 된 후에 Javascript로 처리하는 방법에 대해 생각할 수 있습니다. ajax 호출 (캐시 외부)을 사용하여 게시물 제목을 잡은 다음 필요에 따라 기존 페이지를 검색하고 교체하십시오. – Grant

답변

1

예, 시간이지나면서 게시물 수가 늘어 나면 비용이 훨씬 더 많이 듭니다. 그러나 이것을 수행하는 것이 훨씬 더 나은 방법이 있습니다. 유스 케이스를 고려할 때,이를 위해 정확한 게시물 제목을 알아야합니다. 따라서, 이미 귀하의 사이트를 둘러보고 어떤 게시물의 정확한 제목을 얻으려면 필연적으로 해당 게시물의 URL을 찾아야합니다. 당신의 일은 원시 포스트 타이틀을 가져 와서 사이트의 기존 게시물에 대한 참조로 마술처럼 렌더링하는 영리한 메커니즘을 만드는 것입니다. 그러나해야 할 일은 포스트 작성자로서 명시 적 참조를 작성하고 불필요한 사후 게시물 제목에서 연기하는 것입니다. 처리.

웹 사이트 또는 다른 곳에있는 다른 게시물 또는 다른 리소스 일 수도 있고 참조를 만들 수도 있습니다. 예를 들어 Markdown을 이라는 목록을 가리키는 구문 [Title][#]을 통해 참조를 만드는 데 사용하지만 그 외에도 많은 것이 있습니다. 마크 업 언어와 관련하여 많은 질문이 있다는 것을 알고 있습니다. 일부는 장고의 편집자와 관련이 있기 때문에 뭔가 해결할 수 있고 즉시 장고 인스턴스에 연결해야합니다.

+0

하지만 내가 만든 모든 게시물을 기억할 수는 없습니다. –

+0

그냥 이미 참조 지원을 제공하는 뭔가를 취해야한다는 것을 말하고, 시스템을 작성하지 않고 컨텐츠 작성자에게 권한을 부여하여 참조를 작성해야합니다. 현재 상태 : 시스템이 컨텐트를 구축하고 있으면, 시스템에 존재하는 모든 게시물에 대해 게시물 내용을 한 번 반복하는 각 요청에 대해 일단 LinkBack 태그를 통해 게시물이 처리됩니다. 무엇 때문에? 네가하려는 일은 영리하지만 비 직관적인데, 나는이 모든 것을 정당화하는 데 충분히 유용할지에 대해 주로 염려한다. 간단하게 유지하고 마크 업 편집기를 사용하십시오. –

+0

직관력이 없다는 것이 무엇입니까? 사용자가 링크가 실제로 다른 게시물에 링크된다는 것을 이해하지 못할 것이라고 생각합니까? –

관련 문제