Twitter 中有一个名为主题标签的功能,可以从消息中提取标签。
例如,在
"Hey #guys, I love #stackoverflow"
#guys
和#stackoverflow
可点击并引发他们自己的查询。
我正在构建一个类似的训练应用程序,我想知道何时何地在输出中实际注入(inject)链接?
我抓取所有最近的推文:
def index(request):
latest_tweets = Tweet.objects.all().order_by('-pub_date')[:5]
return render_to_response('index.html',
{ 'tweets': latest_tweets },
context_instance=RequestContext(request)
)
在我渲染的 block 中:
{% for tweet in tweets %}
<p>{{tweet.message}}</p>
{% endfor %}
但这当然只显示纯消息,没有链接。
我想要每个#tag
在message
替换为将查询字符串中的标记名称传递到名为 by_tag
的 View 的链接.
是否插入<a href="...">
s 属于 views.py
?那么如果我后来决定这是一个 AJAX 链接怎么办?好吧,看来这属于模板。但是如何使用模板路由进行如此复杂的替换呢?我应该编写自定义模板过滤器吗?
仅供引用,Tweet
包含其 Tag
位于名为 tags
的字段中.
最佳答案
我上周做了类似的事情并编写了一个快速自定义template filter扫描文本寻找提及和主题标签并将它们包装在链接中。
https://gist.github.com/1023144
当您执行 HTML 标记/替换时,在模板级别执行此操作是有意义的。
通常,您的 View 执行路由逻辑,即获取 URL、检索和聚合必要的数据以及呈现模板。
如果您需要在模型上执行任何关联的逻辑(例如,与推文进行比较),最好将其放入模型函数或模型管理器中,因为它是与您的模型相关的逻辑,并且数据库。
模板级别的任何逻辑通常都应该解决从 View 接收到的数据的结构和显示问题。
但有时,您可能希望在模板级别执行一些逻辑,以便可以在不同的 View 中重用它(例如抓取前 10 个最流行的标签)。这是创建模板标签来执行逻辑的好时机(而且它也很好并且可重用)
无论如何,将该代码放入:
yourapp/templatetags.py
在模板中:
{% for tweet in tweets %}
<p>{{ tweet.message|twittify }}</p>
{% endfor %}
关于django - Django 中 View 和模板之间的职责划分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6337293/