Django获取绝对URL

neu*_*se7 15 django url absolute

我想在模板中获取绝对URL.我无法使用网址.它给了我一个相对的URL.我需要得到这个:

http://domain.tld/article/post
Run Code Online (Sandbox Code Playgroud)

但是Django只给了我

/article/post
Run Code Online (Sandbox Code Playgroud)

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

模板代码:

{% url 'blog:detail' blog.slug %}
Run Code Online (Sandbox Code Playgroud)

Kev*_*nry 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)
Run Code Online (Sandbox Code Playgroud)

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

编辑

假设您想在{% for postobj in posts %}视图中执行此操作,您可以执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

然后在您循环的模板中,postobj.post您可以访问postobj.url和{% for postobj in posts %}.


neu*_*se7 7

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

将其添加到模板标记中,然后使用默认的url标记:

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

这是绝对URL模板标签的Gist,您需要将请求对象添加到template_context_processors,否则这将无效.要实现此目的,请打开settings.py并添加以下以下行:

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)
Run Code Online (Sandbox Code Playgroud)