2013-07-25 26 views
15

Chcę uzyskać bezwzględny adres URL w szablonach. Nie mogę zrobić tego za pomocą adresu URL. Daje mi względny URL. Muszę dostać to:Django Uzyskaj bezwzględny adres URL

http://domain.tld/article/post 

ale Django daje mi tylko

/article/post 

Grałem z settings.py, ale to nie działa. (Debug = false, pozwoliła gospodarze Vs.) kod

Szablon:

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

możliwy duplikat [django pełny adres URL Get \ _absolute \ _url] (http://stackoverflow.com/questions/3994060/django- pełny adres URL-w-get-absolute-url) – karthikr

+0

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.build_absolute_uri To może ci pomóc. –

Odpowiedz

7

Po długim spotkaniu z Django dowiedziałem się wielu rzeczy. W przypadku tego problemu utworzyłem bezwzględny adres URL templatetag.

Dodaj ten szablon do tagów, a następnie użyć jak domyślne tagu URL:

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

Here is the Gist for the absolute URL templatetag, trzeba będzie dodać obiekt żądania do template_context_processors, inaczej to nie zadziała. Aby to osiągnąć, należy otworzyć swój settings.py i dodać te następujące wiersze:

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

Może być również konieczne załadowanie tagu szablonu, np. zakładając, że plik ma nazwę 'absurl.py', to dodaj ''% obciążenia absurl%} 'do góry szablonu. –

+0

Schludne rozwiązanie, dziękuję. Pamiętaj, aby zrestartować serwer django, aby załadować nowo dodany templatetag. –

29

Łatwo to zrobić w widoku:

from django.core.urlresolvers import reverse 

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

Jeśli trzeba to zrobić w szablonie, prawdopodobnie możesz stworzyć własny tag szablonu bez większych problemów.

Edit

Zakładając, że chcesz to zrobić w widoku Home, można zrobić coś takiego:

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) 

Następnie w szablonie gdy jesteś zapętlenie z {% for postobj in posts %} możesz dostęp postobj.post i postobj.url.

+0

Gdzie go umieścić? Dodałem widoki i modele do kwestionowania. Czy możesz mi pomóc? Pracuję przez 2 dni: S I używam go w pętli for. –

+0

OK, edytowałem odpowiedź, podając przykład kodu na podstawie pliku views.py. Kilka innych uwag: 'filter()' nie wywołuje wyjątku 'DoesNotExist', po prostu zwraca pustą listę; ale 'get()' _does_ raise 'wyjątek 'DoesNotExist', więc powinieneś sprawdzić go w swoim widoku' Detail'. –

Powiązane problemy