【问题标题】: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>

【问题讨论】:

    标签: django django-templates


    【解决方案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 被用于完全其他的东西,比如自动下载)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 2023-03-14
        • 2023-03-15
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多