【问题标题】:Linking a @username in Django Template Variables在 Django 模板变量中链接 @username
【发布时间】:2011-07-25 00:24:58
【问题描述】:

我正在使用 twitter API 并显示推文列表。我想将我的应用程序中的用户名和主题标签链接到适当的位置,但我所拥有的只是一个带有 @ 和 # 符号的字符串。

有没有办法通过django模板我可以说“如果变量包含一个以#开头的单词,用”包围它?

或者我应该使用 Javascript 来做到这一点吗?

任何方法都会有所帮助。

【问题讨论】:

    标签: jquery python django twitter


    【解决方案1】:

    我不确定在不创建自己的过滤器的情况下在模板本身内进行处理,但是您可以使用 python 在控制器中处理它吗?带有正则表达式的基本形式:

    import re
    
    user_pattern = re.compile('(\s|^)(@)(\w+)(\s|$)')
    tweet = 'Hey @pssdbt, thats not what I wanted!'
    tweet = user_pattern.sub('\1<a href="http://www.twitter.com/\3">\2\3</a>\4', tweet)
    

    这应该导致:

    'hey <a href="http://www.twitter.com/pssdbt">@pssdbt</a>, thats not what i wanted!'
    

    同样的方法也适用于主题标签。不过,我认为用 javascript 处理也不会太难。

    更新/作为自定义过滤器:

    根据http://docs.djangoproject.com/en/dev/howto/custom-template-tags/,您只需创建一个名为 your_app/templatetags/twittify.py 的文件

    在该文件中,添加:

    from django import template
    from django.utils.html import conditional_escape
    from django.utils.safestring import mark_safe
    import re
    
    register = template.Library()
    
    @register.filter(name='twittify')
    def twittify(tweet, autoescape=None):
        tweet = conditional_escape(tweet)
        user_pattern = re.compile('(\s|^)(@)(\w+)(\s|$)')
        tweet = user_pattern.sub('\1<a href="http://www.twitter.com/\3">\2\3</a>\4', tweet)
        return mark_safe(tweet)
    
    twittify.needs_autoescape = True
    

    然后在你的模板中,你应该可以使用这样的东西(假设这是它的样子):

    <ul id="tweets">
        {% for tweet in tweets %}
            <li>{{ tweet | twittify }}</li>
        {% endfor%}
    </ul>
    

    我以前从未使用过自定义过滤器,但希望这至少能让你找到正确的方向。

    【讨论】:

    • 实际上,您可以在过滤器中使用或多或少相同的代码。
    • 你说得对 - 我有一段时间没有研究过在 Django 中创建过滤器了,在再次检查之后实际上会很简单。
    • 哈哈,我本来打算用一个叫做“twittify”的过滤器来做这个。您可以添加功能来检查链接是否有效/用户是否存在并相应地标记
    • 是的,过滤器听起来更像我需要的,因为这是来自他们的 API,我宁愿只对推文变量应用过滤器,而不是在 python 中处理它。
    • 更新很棒。对于其他任何人来说,它实际上是两个斜杠,而不是一个 .. 所以 \\1 \\2 \\3 \\4
    猜你喜欢
    • 2012-03-06
    • 2013-05-26
    • 2011-08-16
    • 2015-09-02
    • 2012-01-21
    • 2016-01-12
    • 1970-01-01
    • 2012-12-11
    • 2017-03-10
    相关资源
    最近更新 更多