如何在 TextFields 中保存链接

xRo*_*bot 3 django django-templates

我有一个带有 TextField 的简单博客模型。在 TextField 中保存链接的最佳方法是什么?

1)以这种形式在数据库中保存链接:http : //www.example.com ,然后在模板中使用一些过滤器将其转换为形式:

<a rel="nofollow" href="http://www.example.com>http://www.example.com</a>
Run Code Online (Sandbox Code Playgroud)

2)以这种形式直接在数据库中保存链接:

<a rel="nofollow" href="http://www.example.com>http://www.example.com</a>
Run Code Online (Sandbox Code Playgroud)

Chr*_*lor 5

假设您正在谈论如何保存您在博客文章中包含的链接(或任何 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)
Run Code Online (Sandbox Code Playgroud)

为了使数据输入方面的事情变得更简单,您还可以添加一个不错的 javascript 编辑器 -就像我现在正在输入此答案的编辑器一样

  • 最好使用 `save(self, *args, **kwargs)` 而不是将整个 `*args, **kwargs` 传递给超级调用。 (3认同)