Какой лучший способ заменить заголовки ссылками на другие сообщения? - PullRequest
1 голос
/ 02 марта 2011

У меня есть модель поста, которая выглядит следующим образом:

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

Однако я боюсь, что это замедлит работу моего сайта, когда будет много сообщений.
Есть ли способ оптимизировать этот цикл?
Iможно подключить его к сигналу pre_save, но он будет ссылаться только на существующие сообщения, и мне кажется, что я нарушаю принцип разделения интересов .
Какой лучший способ сделать это?

РЕДАКТИРОВАТЬ:
Должен ли я делать это в работе cron?Таким образом, мне не нужно заниматься проблемой производительности, однако я все еще нарушаю SOC здесь, так как это не проблема данных.

1 Ответ

1 голос
/ 03 марта 2011

Да, со временем это станет еще дороже по мере увеличения количества постов. Но есть гораздо лучший подход, чтобы сделать это. Когда вы рассматриваете вариант использования, вам нужно знать точное название поста, чтобы это работало. Так что, если вы уже просматриваете свой сайт, чтобы получить точное название какого-либо поста, вам также неизбежно придется столкнуться с URL поста, верно? То, что вы делаете, - это создаете умный механизм, который будет принимать необработанные заголовки постов и магически отображать их как ссылки на существующие посты на вашем сайте, но вам следует создать явную ссылку в качестве автора поста и отказаться от ненужных пост-постов. обработка.

Реализация поддержки для создания ссылок, будь то другие публикации или некоторые другие ресурсы, расположенные на вашем сайте или где-то еще. Например, SO использует Markdown для создания ссылок с помощью синтаксиса [Title][#], указывающего на список [#]: <a href="http://path.to" rel="nofollow">http://path.to</a>, но есть много других. Я знаю, что есть много вопросов, связанных с языками разметки, некоторые с редакторами специально для Django, так что я уверен, что вы можете остановиться на чем-нибудь и подключить его к своему экземпляру Django в кратчайшие сроки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...