{% url url_name %}
は相対名を与えます。
どうすれば{% absolute_url url_name %}
ベース(存在する場合はポートを含む)を含むURLを返すようにするには?
さまざまな解決策があります。独自のテンプレートタグを記述し、HttpRequest.build_absolute_uri(location)
を使用します。しかし、別の方法で、少しハック。
<a href="{{ request.scheme }}://{{ request.get_Host }}{% url url_name %}">click here</a>
build_absolute_uri()
メソッドをリクエストオブジェクトで使用できます。テンプレートでは、これをrequest.build_absolute_uri
として使用します。これにより、プロトコル、ホスト、ポートを含む絶対アドレスが作成されます。
例:
<a href="{{request.build_absolute_uri}}">click here</a>
テンプレートでは、これを使用して、プロトコル、ホスト、およびポート(存在する場合)を含む絶対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,)))
カスタムタグ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>