{% url url_name %}
给出了相对名称。
如何执行{% absolute_url url_name %}
之类的操作,以便它返回带基数的url(包括端口,如果存在)?
答案 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>