使用 jinja2 仅显示 URL 域的最佳方法

use*_*000 4 python django templates jinja2

我有存储在 Django 模型中的 URL,我想将其显示在模板上,但我只想显示如下所示的域:

原始网址:

https://wikipedia.org/wiki/List_of_chemical_process_simulators
Run Code Online (Sandbox Code Playgroud)

展示:

wikipedia.org/...
Run Code Online (Sandbox Code Playgroud)

完全在后端、字体端或使用 jinja2 的自定义函数来处理这个问题会更好吗?

ale*_*cxe 5

如果您稍后会在整个项目的模板中重用它,并且考虑到涉及的逻辑非常简单,那么在这里定义自定义模板过滤器就完全可以了。

用于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/...'
Run Code Online (Sandbox Code Playgroud)

这是一个简单的示例,您应该另外提供错误处理机制,以防urlparse()解析传入的 url 失败。


buf*_*ufh 5

最好的方法可能是 @alecxe 回答的自定义模板过滤器,但如果您不能,这里有一个非万无一失的方法供将来参考。

\n\n
{{ original_url.rpartition("//")[-1] }}\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • https://wikipedia.org/wiki/List_of_chemical_process_simulators \xe2\x86\x92 wikipedia.org/wiki/List_of_chemical_process_simulators
  • \n
  • //example.net/path/to/file \xe2\x86\x92 example.net/path/to/file
  • \n
  • ftp://example.net/pub \xe2\x86\x92 example.net/pub
  • \n
\n\n

仅获取域名(主机名):

\n\n
{{ original_url.rpartition("//")[-1].partition("/")[0] }}\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • https://wikipedia.org/wiki/List_of_chemical_process_simulators \xe2\x86\x92 wikipedia.org
  • \n
  • //example.net/path/to/file \xe2\x86\x92 example.net
  • \n
  • ftp://example.net/pub \xe2\x86\x92 example.net
  • \n
\n