【问题标题】:Dividing responsibility between View and Template in Django在 Django 中划分视图和模板之间的责任
【发布时间】:2011-09-14 07:16:42
【问题描述】:

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

"Hey #guys, I love #stackoverflow"

#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)
                              )

我在一个块中渲染:

{% for tweet in tweets %}
    <p>{{tweet.message}}</p>
{% endfor %}

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

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

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

【问题讨论】:

    标签: django django-templates django-views django-template-filters


    【解决方案1】:

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

    https://gist.github.com/1023144

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

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

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

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

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

    不管怎样,把代码放在:

    yourapp/templatetags.py
    

    在模板中:

    {% for tweet in tweets %}
        <p>{{ tweet.message|twittify }}</p>
    {% endfor %}
    

    【讨论】:

    • 感谢您的精彩解释和代码 sn-p。现在我想知道:在模板中硬核应用程序链接是否可以?例如,在 ASP .NET MVC 中,我们调用 Url.Route ('Product', 'Create'),而不是像 /product/create/ 这样指定 URL,它读取路由表并通过控制器和操作名称提供 URL。这通常如何在 django 中完成? (考虑到我希望链接转到带有name 参数的by_tag 视图)
    • 是的,您可以获得该功能。如果您想在视图或应用程序逻辑中查找 URL,请使用反向功能:(docs.djangoproject.com/en/dev/topics/http/urls/#reverse) 或者如果您想在模板中实现相同的功能,请使用“url”模板标签:(@987654324 @)。如果您无法使其正常工作,请提出一个新问题,您将能够获得帮助
    • 这些链接是我所需要的,我发誓如果我用谷歌搜索的话我可以找到它们。非常感谢您的帮助!
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多