web-dev-qa-db-ja.com

Djangoテンプレートで絶対的なURLに名前を逆にする方法?

{% url url_name %}は相対名を与えます。

どうすれば{% absolute_url url_name %}ベース(存在する場合はポートを含む)を含むURLを返すようにするには?

28
eugene

さまざまな解決策があります。独自のテンプレートタグを記述し、HttpRequest.build_absolute_uri(location)を使用します。しかし、別の方法で、少しハック。

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

build_absolute_uri()メソッドをリクエストオブジェクトで使用できます。テンプレートでは、これをrequest.build_absolute_uriとして使用します。これにより、プロトコル、ホスト、ポートを含む絶対アドレスが作成されます。

例:

 <a href="{{request.build_absolute_uri}}">click here</a>
13
Aneesh R S

テンプレートでは、これを使用して、プロトコル、ホスト、およびポート(存在する場合)を含む絶対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,)))
9
igo

カスタムタグ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>
0
shuckc