2013-07-25 17 views
15

Şablonlarda mutlak url almak istiyorum. Url ile yapamam. Bana göreli bir URL veriyor.Django Mutlak URL Al

http://domain.tld/article/post 

ama Django ben settings.py ile oynanan ama işe yaramadı sadece

/article/post 

bana verir: Ben bu almak gerekir.

Şablon kodunu (ayıklama = false, ana VS. izin verilir):

{% url 'blog:detail' blog.slug %} 
+0

olası yinelenen http://stackoverflow.com/questions/3994060/django- ([olsun \ _absolute \ _url tam url django] tam-url-in-get-mutlak-url) – karthikr

+0

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.build_absolute_uri Bu size yardımcı olabilir. –

cevap

7

Django ile uzun bir toplantıdan sonra pek çok şey öğrendim. Bu sorun için mutlak bir URL şablon etiketi oluşturdum.

varsayılan url etiketi gibi, şablon etiketlerine ekleyin:

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

Here is the Gist for the absolute URL templatetag, aksi halde bu işe yaramaz, template_context_processors isteği nesne eklemek gerekir. Bunu başarmak için, settings.py açın ve bu aşağıdaki satırları ekleyin: ait

from django.conf import global_settings 
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request', 
) 
+0

Ayrıca, şablon etiketini de yüklemeniz gerekebilir, ör. Dosyanın adı "absurl.py" olarak kabul edildiğinde, şablonunuzun en üstüne –

+0

Neat çözümünü eklediğinizde {% load absurl%} 'ekleyeceksiniz. Yeni eklenen şablon etiketini yüklemek için django dev sunucusunu yeniden başlatmayı unutmayın. –

29

Bu görünümde yapmak kolaydır:

from django.core.urlresolvers import reverse 

url = request.build_absolute_uri(reverse('blog:detail', args=[blog.slug])) 

şablonda yapmak gerekirse, muhtemelen kendi şablon etiketinizi çok fazla sorun olmadan oluşturabilirsiniz.

Düzenleme

Eğer Home görünümünde bunu yapmak istiyor varsayarsak, böyle bir şey yapabileceğini: Sonra

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) 

Şablonunuzdaki Eğer {% for postobj in posts %} yapabilirsiniz ile döngü yaparken Erişim postobj.post ve postobj.url.

+0

Nerede yerleştirilir? Soruları ve modelleri sorgulamak için ekledim. Bana yardım edebilir misin lütfen? 2 gün boyunca çalışıyorum: S ve onu döngü için kullanıyorum. –

+0

Tamam, cevabı, views.py dosyanıza dayalı bir kod örneği ile düzenledim. Bazı diğer notlar: 'filter()' 'DoesNotExist' istisnasını yükseltmez, sadece boş bir liste döndürür; ama 'get()' _does_ 'DoesNotExist' bir istisnayı kaldırır, böylece 'Detay' görünümünde kontrol etmelisiniz. –