Django:在TextFields中干燥内部链接

时间:2011-12-12 13:06:26

标签: django templates url dry

我有一个包含大量“项目”的网站,这些网站经常在其描述中相互引用(存储在TextField中)。 我不想在描述中对项目之间的链接进行硬编码,而是通过使用某种令牌来引用DRY,例如,在描述字段中:

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中,这种效果通常通过某种方式通过节点/对象ID链接到项目来实现 - 这样,如果链接发生变化,仍然可以遵循引用。

我考虑过:

  • 将文本字段评估为模板,并在说明中使用“url”模板标签。似乎是最简单的解决方案,但该模板标签对于内容编辑器并不是特别友好,并且通过整个模板渲染器评估每个描述看起来有点麻烦。
  • 实现一个模板标签,它只是重新实现了一个基本的仿制系统,只是为此目的解析一个漂亮的简单标签。
  • 扩展TextField以在将描述保存到数据库之前对其进行预处理。

有没有人做过类似的事情?你会建议什么?

2 个答案:

答案 0 :(得分:2)

我刚回答a similar question on SO,似乎它也可能解决您的问题(如果您偶然在三年后仍在寻找答案)。

我编写了一个模板过滤器,用于在显示之前解析文本字段中的自定义内部链接格式。我使用Markdown来解析我的文本字段,因此我将链接以Markdown格式返回,但它们可以很容易地以HTML格式编写。

Check out my answer here.

更新:我发布了a revised version on djangosnippets.org,它解决了降价格式链接中的内部链接,以及他们自己的链接。

答案 1 :(得分:0)

如果我遇到了您的问题,您应该使用自定义模板处理器将字典传递给您的模板: 在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)