【问题标题】:Best way to display only URL domain using jinja2使用 jinja2 仅显示 URL 域的最佳方法
【发布时间】:2015-02-26 01:55:27
【问题描述】:
我有存储在 Django 模型中的 URL,我想在模板上显示,但我只想像这样显示域:
原始网址:
https://wikipedia.org/wiki/List_of_chemical_process_simulators
显示:
wikipedia.org/...
完全在后端、字体端或使用 jinja2 的自定义函数上处理这个会更好吗?
【问题讨论】:
标签:
python
django
templates
jinja2
【解决方案1】:
最好的方法可能是@alecxe 回答的自定义模板过滤器,但如果你不能,这里有一个非万无一失的方法供将来参考。
{{ original_url.rpartition("//")[-1] }}
https://wikipedia.org/wiki/List_of_chemical_process_simulators → wikipedia.org/wiki/List_of_chemical_process_simulators
//example.net/path/to/file → example.net/path/to/file
ftp://example.net/pub → example.net/pub
只获取域名(主机名):
{{ original_url.rpartition("//")[-1].partition("/")[0] }}
https://wikipedia.org/wiki/List_of_chemical_process_simulators → wikipedia.org
//example.net/path/to/file → example.net
ftp://example.net/pub → example.net
【解决方案2】:
如果您稍后会在整个项目的模板中重用它,并且考虑到其中涉及的逻辑非常简单,那么在这里定义 custom template filter 是完全可以的。
使用urlparse.urlparse()获取域名:
>>> from urlparse import urlparse
>>> from jinja2 import Environment, Template
>>>
>>> def get_domain(url):
... return "%s/..." % urlparse(url).netloc
...
>>>
>>> env = Environment()
>>> env.filters['domain'] = get_domain
>>>
>>> template = env.from_string('{{ url|domain }}')
>>> template.render(url='https://wikipedia.org/wiki/List_of_chemical_process_simulators')
u'wikipedia.org/...'
这是一个简单的例子,你应该额外提供一个错误处理机制,以防urlparse()解析传入的url失败。