2013-07-25 26 views
15

Voglio ottenere l'URL assoluto nei modelli. Non posso fare con l'url. Mi dà un URL relativo. Ho bisogno di ottenere questo:Django Ottieni URL assoluto

http://domain.tld/article/post 

ma Django mi dà solo

/article/post 

Ho giocato con settings.py, ma non ha funzionato. (Debug = false, ha consentito host vs) Codice

Template:

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

possibile duplicato del [Django URL completo a get \ _absolute \ _url] (http://stackoverflow.com/questions/3994060/django- full-url-in-get-absolute-url) – karthikr

+0

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.build_absolute_uri Questo potrebbe aiutarti. –

risposta

7

Dopo un lungo incontro con Django, ho imparato un sacco di cose. Per questo problema, ho creato un URL assoluto templatetag.

Aggiungere questo ai tag di template, quindi utilizzare come tag url di default:

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

Here is the Gist for the absolute URL templatetag, è necessario aggiungere oggetto di richiesta di template_context_processors, altrimenti questo non funzionerà. Per raggiungere questo obiettivo, aprire il settings.py e aggiungere queste righe seguenti:

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

Potrebbe anche essere necessario caricare il tag del modello, ad es. supponendo che il file si chiami 'absurl.py 'allora dovresti aggiungere' {% load absurl%} 'all'inizio del tuo modello –

+0

Soluzione pulita, grazie. Ricordarsi di riavviare il server dev django per caricare il nuovo templatetag aggiunto. –

29

Questo è facile da fare nella vista:

from django.core.urlresolvers import reverse 

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

Se avete bisogno di farlo nel modello, probabilmente puoi creare il tuo tag modello senza troppi problemi.

Modifica

Supponendo che si vuole fare questo nella vostra Home vista, si potrebbe fare qualcosa di simile:

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) 

Poi nel modello, mentre si sta loop con {% for postobj in posts %} è possibile accesso postobj.post e postobj.url.

+0

Dove collocarlo? Ho aggiunto le viste e i modelli alla domanda. Mi potete aiutare per favore? Lo sto lavorando da 2 giorni: S E lo sto usando in loop. –

+0

OK, ho modificato la risposta con un esempio di codice basato sul tuo views.py. Alcune altre note: 'filter()' non solleva un'eccezione 'DoesNotExist', ma restituisce solo una lista vuota; ma 'get()' _does_ genera un'eccezione 'DoesNotExist', quindi dovresti controllarla nella tua vista' Dettagli'. –