如何在文本字段中保存链接
Posted
技术标签:
【中文标题】如何在文本字段中保存链接【英文标题】:How to save links in TextFields 【发布时间】:2011-02-21 20:37:10 【问题描述】:我有一个带有 TextField 的简单博客模型。 在 TextField 中保存链接的最佳方法是什么?
1) 以这种形式在数据库中保存链接:http://www.example.com 然后在模板中使用一些过滤器将其转换为形式:
<a rel="nofollow" href="http://www.example.com>http://www.example.com</a>
2)直接以这种形式将链接保存在数据库中:
<a rel="nofollow" href="http://www.example.com>http://www.example.com</a>
【问题讨论】:
【参考方案1】:假设您正在讨论如何保存包含在博客文章中的链接(或任何 html 格式),而不是独立链接(例如 blogroll):
您可能需要考虑采用某种标记语言,例如 Markdown 或 BBCode。然后,您将以纯标记语法存储博客文章,并提供一种方法(如blog.get_post()
)来解析存储的标记并返回 HTML。然后,您可以在模板中使用 safe
过滤器来避免转义 HTML。
更好的是,为了避免在每个请求上解析您的标记,请将其缓存在数据库中。将一个名为 text_html 的 TextField 添加到您的 Blog
模型中。覆盖 Blog
模型的 save
方法以将标记解析为 HTML 并将 HTML 保存到 text_html 字段。
然后当您想在模板中呈现博客文章时,您可以使用 post.text_html|safe
,而无需每次都解析您的标记。
因此您的博客模型可能如下所示(为清楚起见仅显示文本字段)
import markdown
class BlogPost(models.Model):
text = models.TextField()
text_html = models.TextField(editable=False) # don't want to see this in Admin
def save(self, force_insert=False, force_update=False):
self.text_html = markdown(self.text)
super(BlogPost, self).save(force_insert, force_update)
为了简化数据输入方面的工作,您还可以添加一个不错的 javascript 编辑器 - like the one I'm typing this answer in right now。
【讨论】:
我想是的。这是一种非规范化 - 牺牲一点数据库空间以获得更快的访问(不必为每个请求解析降价)。数据库空间通常比 CPU 时间“便宜”很多。这也是 James Bennett 的 Practical Django Projects 一书中推荐的方法。我过去曾成功使用过它。 巧合的是,书中的例子甚至是一个博客项目。 最好使用save(self, *args, **kwargs)
,而不是将整个*args, **kwargs
传递给超级调用。【参考方案2】:
使用第二种选择,然后使用safe 转义html代码
【讨论】:
【参考方案3】:您可以使用URL field(当然是或 TextField),然后在模板中呈现它。
<a rel="nofollow" href=" url "> url </a>
【讨论】:
我说的是 TextField 中的链接 ;) 好吧,我建议您使用 URL 字段而不是文本字段。为什么首先使用 TextField?此外,即使您想使用 TextField,我的回答也是完全一样的。 OP 正在讨论博客文章中包含的链接。我认为没有任何(好的)方法可以根据特定帖子中的链接数量来拥有任意数量的 URLField。【参考方案4】:我会保存 URL 本身,并在输出中附加标签和参数。在我看来,最好将数据的存储、处理和呈现分开,以便更容易地适应未来的变化(例如,在未来的版本中,URL 被用于完全其他的东西,比如自动下载)。
【讨论】:
以上是关于如何在文本字段中保存链接的主要内容,如果未能解决你的问题,请参考以下文章
在VueJS中使用'require'显示图像时如何保存图像链接?