Django: DRY Внутренние ссылки в TextFields - PullRequest
1 голос
/ 12 декабря 2011

У меня есть сайт с кучей «проектов», которые часто ссылаются друг на друга в своих описаниях (хранятся в TextField). Вместо того, чтобы жестко кодировать ссылки между проектами в их описаниях, я бы хотел сохранить СУХОЕ содержание, ссылаясь на них с помощью какого-то токена, например, в поле описания:

Blabla text describing this project, this project was inspired by 
{{ project "ProjectB"}} and lead to the development of {{ project "ProjectC" }}.

Который затем обрабатывается и превращается в:

Blabla text describing this project, this project was inspired by 
<a href="/projects/ProjectB">ProjectB</a> and lead to the development 
of <a href="/projects/ProjectC">ProjectC</a>.

Чтобы быть ясным: описание является свободным текстом, который не может содержать много ссылок на другие элементы в виде гиперссылок в различных точках текста. В CMS этот эффект обычно достигается с помощью какого-либо способа связать элементы с идентификатором узла / объекта - так что, если ссылка изменится, ссылка все равно будет сохранена.

Я считал:

  • Оценка текстового поля в качестве шаблона и использование тега шаблона 'url' в описаниях. Похоже, самое простое решение, но этот шаблон тега не особенно удобен для редакторов контента, и оценка каждого описания через весь рендерер шаблонов кажется немного громоздкой.
  • Реализация тега шаблона, который просто заново реализует базовую систему искусственного шаблона, чтобы просто разобрать хороший простой тег для этой цели.
  • Расширение TextField для предварительной обработки описания перед его сохранением в базе данных.

Кто-нибудь делал что-нибудь подобное? Что бы вы предложили?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2014

Я только что ответил на аналогичный вопрос по SO , и кажется, что это может решить и вашу проблему (если случайно вы все еще ищете ответ через три года).

Я написал шаблонный фильтр для анализа пользовательского формата внутренней ссылки в текстовом поле перед отображением.Я использую Markdown для синтаксического анализа своих текстовых полей, поэтому я вернул ссылки в формате Markdown, но вместо этого их можно было бы легко записать в виде HTML.

Проверьте мой ответ здесь.

Обновление: Я разместил пересмотренную версию на djangosnippets.org , которая разрешает внутренние ссылки внутри ссылки в формате уценки, а также самостоятельно.

0 голосов
/ 12 декабря 2011

если у меня возникла ваша проблема, вы должны использовать собственный обработчик шаблонов для передачи словаря в ваши шаблоны: в settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "myapp.myprocessor.foo",
)

в myapp / myprocessor.py:

from django import template    
def foo(request):
  ProjectA = get_Project_from_database
  t = template.Template(ProjectA.html)
  c = template.Context({'name': ProjectA.name})
  rendered_ProjectA = t.render(c)
  return { 'rendered_ProjectA': rendered_ProjectA }

или если вы не хотите использовать систему шаблонов Django, вы можете использовать регулярные выражения (import re)

...