2013-07-25 41 views
15

Tôi muốn nhận url tuyệt đối trong các mẫu. Tôi không thể làm với url. Nó mang lại cho tôi một URL tương đối. Tôi cần phải có được điều này:Django Nhận URL Tuyệt đối

http://domain.tld/article/post 

nhưng Django mang lại cho tôi chỉ

/article/post 

tôi chơi với settings.py nhưng nó đã không làm việc. (Debug = false, cho phép host vs) mã

mẫu:

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

thể trùng lặp của [url django đầy đủ trong get \ _absolute \ _url] (http://stackoverflow.com/questions/3994060/django- url đầy đủ-trong-get-tuyệt đối) – karthikr

+0

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.build_absolute_uri Điều này có thể giúp bạn. –

Trả lời

7

Sau một thời gian dài gặp Django, tôi đã học được rất nhiều điều. Đối với vấn đề này, tôi tạo ra một templatetag URL tuyệt đối.

Thêm này vào mẫu thẻ của bạn, sau đó sử dụng như thẻ url mặc định:

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

Here is the Gist for the absolute URL templatetag, bạn sẽ cần phải thêm đối tượng yêu cầu để template_context_processors, nếu không điều này sẽ không làm việc. Để đạt được điều này, mở settings.py của bạn và thêm những dòng sau đây:

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

Bạn cũng có thể cần tải thẻ mẫu, ví dụ: giả sử tập tin được đặt tên là 'absurl.py' thì bạn sẽ thêm' {% load absurl%} 'vào đầu mẫu của bạn –

+0

Giải pháp gọn gàng, cảm ơn. Hãy nhớ khởi động lại máy chủ django dev để tải templatetag mới được thêm vào. –

29

này rất dễ dàng để làm trong giao diện:

from django.core.urlresolvers import reverse 

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

Nếu bạn cần phải làm điều đó trong bản mẫu, bạn có thể tạo thẻ mẫu của riêng mình mà không gặp quá nhiều rắc rối.

Sửa

Giả sử rằng bạn muốn làm điều này trong Home tầm nhìn của bạn, bạn có thể làm một cái gì đó như thế này:

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) 

Sau đó, trong mẫu của bạn trong khi bạn đang lặp với {% for postobj in posts %} bạn có thể truy cập postobj.postpostobj.url.

+0

Nơi đặt nó? Tôi đã thêm các chế độ xem và mô hình vào câu hỏi. Bạn co thể giup tôi được không? Tôi đang làm việc trong 2 ngày: S Và tôi đang sử dụng nó trong vòng lặp. –

+0

OK, tôi đã chỉnh sửa câu trả lời bằng một ví dụ về mã dựa trên views.py của bạn. Một số lưu ý khác: 'filter()' không tăng ngoại lệ 'DoesNotExist', nó chỉ trả về một danh sách trống; nhưng 'get()' _does_ nâng cao một ngoại lệ 'DoesNotExist', do đó bạn nên kiểm tra nó trong khung nhìn' Detail' của bạn. –