我有一个带TextField的简单Blog模型。 在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>
答案 0 :(得分:4)
假设您正在讨论如何保存您在博客帖子中包含的链接(或任何HTML格式),而不是独立链接(例如blogroll):
您可能想考虑采用某种标记语言,如Markdown或BBCode。然后,您将以纯标记语法存储博客文章,并提供一种方法(如blog.get_post()
),该方法将解析存储的标记并返回HTML。然后,您可以在模板中使用safe
过滤器,以避免转义HTML。
更好的是,为避免在每个请求中解析标记,请将其缓存在数据库中。向您的Blog
模型添加一个名为text_html的TextField。覆盖您的Blog
模型的save
方法,将标记解析为HTML并将HTML保存到text_html字段。
然后,当您想要在模板中呈现博客帖子时,您可以使用{{ post.text_html|safe }}
,而无需每次都解析您的标记。
因此,您的Blog模型可能如下所示(为清晰起见,仅显示文本字段)
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。
答案 1 :(得分:0)
我会保存URL本身,并在输出中附加标记和参数。在我看来,最好将数据的存储,处理和呈现分开,以便更容易适应未来的变化(例如,在未来的版本中,URL被用于完全其他类似自动下载的东西)。
答案 2 :(得分:0)
您可以使用URL field(或一个TextField,当然)然后在模板中呈现它。
<a rel="nofollow" href="{{ url }}">{{ url }}</a>
答案 3 :(得分:0)
使用第二种方法,并在使用safe后转义html代码