Django 中视图和模板之间的职责划分

Dan*_*mov 2 django django-templates django-views django-template-filters

Twitter 中有一个称为主题标签的功能,可以从消息中提取标签。
例如,在

"Hey #guys, I love #stackoverflow"
Run Code Online (Sandbox Code Playgroud)

#guys并且#stackoverflow是可点击的并导致他们自己的查询。

我正在构建一个类似的培训应用程序,我想知道何时何地在输出中实际注入链接

我抓取了所有最近的推文:

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)
                              )
Run Code Online (Sandbox Code Playgroud)

在一个块中我渲染:

{% for tweet in tweets %}
    <p>{{tweet.message}}</p>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但这当然只显示普通消息,没有链接。
我希望每个#taginmessage都替换为将查询字符串中的标记名称传递到名为 的视图的链接by_tag

插入的<a href="...">s 属于 吗views.py?那么如果我后来决定这是一个 AJAX 链接怎么办?好吧,看来这属于模板。但是如何使用模板路由进行如此复杂的替换呢?我应该编写自定义模板过滤器吗?

仅供参考, aTweet将其Tags 包含在名为 的字段中tags

Tim*_*ony 5

我上周做了类似的事情,编写了一个快速自定义模板过滤器来扫描文本,查找提及和主题标签并将它们包装在链接中。

https://gist.github.com/1023144

当您执行 HTML 标记/替换时,在模板级别执行此操作是有意义的。

通常,您的视图执行路由逻辑,即获取 url、检索和聚合必要的数据以及呈现模板。

如果您需要在模型上执行任何关联的逻辑(例如,与推文进行比较),最好将其放入模型函数或模型管理器中,因为它是与模型和数据库相关的逻辑。

模板级别的任何逻辑通常都应该解决从视图接收到的数据的结构化和显示问题。

但有时,您可能希望在模板级别执行一些逻辑,以便可以在不同的视图中重用它(例如抓取前 10 个最流行的标签)。这是创建模板标签来执行逻辑的好时机(而且它也很好且可重用)

无论如何,将该代码放入:

yourapp/templatetags.py
Run Code Online (Sandbox Code Playgroud)

并在模板中:

{% for tweet in tweets %}
    <p>{{ tweet.message|twittify }}</p>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)