如何在django模板中将名称反转为绝对URL?

时间:2013-09-26 09:18:56

标签: django templates url

{% url url_name %}给出了相对名称。

如何执行{% absolute_url url_name %}之类的操作,以便它返回带基数的url(包括端口,如果存在)?

4 个答案:

答案 0 :(得分:27)

有不同的解决方案。编写您自己的模板标签并使用HttpRequest.build_absolute_uri(location)。但另一种方式,有点hacky。

<a href="{{ request.scheme }}://{{ request.get_host }}{% url url_name %}">click here</a>

答案 1 :(得分:13)

您可以在请求对象中使用build_absolute_uri()方法。在模板中,将其用作request.build_absolute_uri。这将创建绝对地址,包括协议,主机和端口。

示例:

 <a href="{{request.build_absolute_uri}}">click here</a>

答案 2 :(得分:9)

在模板中,我使用它来打印带有协议,主机和端口的绝对URL(如果存在):

<a href="{{ request.scheme }}://{{ request.get_host }}{% url url_name %}">link</a>

在Python中我使用:

from django.core.urlresolvers import reverse

def do_something(request):
    link = "{}://{}{}".format(request.scheme, request.get_host(), reverse('url_name', args=(some_arg1,)))

答案 3 :(得分:0)

我使用自定义标签absurl和上下文处理器django.template.context_processors.request。例如:

tenplatetags\mytags.py中定义的自定义标签:

from django import template
register = template.Library()

@register.simple_tag(takes_context=True)
def absurl(context, object):
    return context['request'].build_absolute_uri(object.get_absolute_url())

settings.py中,确保您具有以下条件:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'OPTIONS': {
        'debug': DEBUG,
        'context_processors': [
            ...
            'django.template.context_processors.request',
            ...

然后确保模型具有build_absolute_url,例如供管理区域使用:

class ProductSelection(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    fixed_price = models.DecimalField(max_digits=10, decimal_places=2, ...
    ...

    def get_absolute_url(self):
        return reverse('myapp:selection', args=[self.slug])

模板中的本身使用absurl将其完全绑定:

 {% load mytags %}
 ...
 <script type="application/ld+json">{
    "@context": "http://schema.org/",
    "@type": "Product",
    "name": " {{selection.title}}",
    ...
    "offers": {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "url": "{% absurl selection %}",      <--- look here
    } }
  </script>