15

我想在模板中获取绝对 url。我不能用网址做。它给了我一个相对的 URL。我需要得到这个:

http://domain.tld/article/post

但 Django 只给了我

/article/post

我玩了 settings.py 但它没有用。(debug=false,允许主机与)

模板代码:

{% url 'blog:detail' blog.slug %}
4

2 回答 2

31

这在视图中很容易做到。例如:

from django.core.urlresolvers import reverse

def Home(request): 
    posts = Article.objects.filter(published=True).order_by('-publish') 
    site = Site.objects.get_current()

    c = RequestContext(request, { 
        'posts': [{'post': post,
                   'url': request.build_absolute_uri(reverse('blog:detail', args=[post.slug]))}
                  for post in posts]
        'site': site,
    }) 

    return render_to_response('templates/index.html', c)

然后,在您的模板中,当您循环使用时,{% for postobj in posts %}您可以访问postobj.postpostobj.url.

如果您想在模板中执行此操作,您可以创建自己的模板标签而不会有太多麻烦。

于 2013-07-25T21:09:11.840 回答
7

经过长时间的与 Django 会面,我学到了很多东西。对于这个问题,我创建了一个绝对 URL 模板标签。

将此添加到您的模板标签,然后使用默认的 url 标签:

{% absurl 'some-view' with, arguments %}

这是绝对 URL 模板标签的要点,您需要将请求对象添加到 template_context_processors,否则这将不起作用。为此,请打开您的 settings.py 并添加以下几行:

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)
于 2015-05-17T00:31:06.320 回答