Django có được URL tệp tĩnh trong chế độ xem


133

Tôi đang sử dụng báo cáo pdfgen để tạo PDF. Trong bản PDF có một hình ảnh được tạo bởi drawImage. Đối với điều này, tôi cần URL đến một hình ảnh hoặc đường dẫn đến một hình ảnh trong chế độ xem. Tôi đã quản lý để xây dựng URL nhưng làm cách nào tôi có được đường dẫn cục bộ đến hình ảnh?

Cách tôi nhận URL:

prefix = 'https://' if request.is_secure() else 'http://'
image_url = prefix + request.get_host() + STATIC_URL + "images/logo_80.png"

Câu trả lời:


286

Vì đây là kết quả hàng đầu trên Google, tôi nghĩ tôi nên thêm một cách khác để làm điều này. Cá nhân tôi thích cái này hơn, vì nó để việc triển khai cho khung Django.

# Original answer said:
# from django.templatetags.static import static
# Improved answer (thanks @Kenial, see below)
from django.contrib.staticfiles.templatetags.staticfiles import static

url = static('x.jpg')
# url now contains '/static/x.jpg', assuming a static path of '/static/'

2
Bạn có biết nếu có một cách rõ ràng để thêm tên máy chủ vào url tĩnh (nếu không có trong STATIC_URL)? Tôi cần thêm hình ảnh hoặc tài nguyên khác vào thư, nơi người dùng sẽ không thể tìm thấy tài nguyên bằng các url tương đối.
gepatino

3
Điều này không hoạt động với tôi khi chạy trong Debug (chưa thử với DEBUG = Sai). Tôi chỉ đơn giản là nhận được đường dẫn truyền vào phương thức tĩnh được trả về. Sử dụng Django 1.6. Có suy nghĩ gì không?
Shawn

Tôi nghĩ rằng mã sử dụng django.contrib.staticfiles.templatetags.staticfiles nên được ưu tiên có tính đến tương thích với kho lưu trữ django và tương tự.
jdcaballerov

@gepatino Bạn có thể định tuyến kết quả thông qua request.build_absolute_urinhư được mô tả ở đây: stackoverflow.com/questions/2345708/iêu
nhuộm

17
Trong Django 2.0, điều này sẽ hiển thị thông báo phản đối. Sử dụng from django.templatetags.static import staticthay thế.
Flimm

86

Tuy nhiên, câu trả lời của dyve là câu trả lời hay, nếu bạn đang sử dụng "bộ nhớ cache" trong dự án django và các đường dẫn url cuối cùng của các tệp tĩnh sẽ bị "băm" (chẳng hạn như style.aaddd9d8d8d7.css từ style.css ), thì bạn không thể có được một url chính xác với django.templatetags.static.static(). Thay vào đó, bạn phải sử dụng thẻ mẫu từ django.contrib.staticfilesđể lấy url băm.

Ngoài ra, trong trường hợp sử dụng máy chủ phát triển, phương thức thẻ mẫu này trả về url không được băm, vì vậy bạn có thể sử dụng mã này bất kể máy chủ đó đang phát triển hay sản xuất! :)

from django.contrib.staticfiles.templatetags.staticfiles import static

# 'css/style.css' file should exist in static path. otherwise, error will occur 
url = static('css/style.css')

1
Cảm ơn vì điều này ... tôi đã mất một thời gian để tìm hiểu lý do tại sao tôi không tiêm băm md5 của mình
ilovett

4
Câu trả lời này vẫn đang nhận được lượt truy cập và được sử dụng tích cực, vì vậy tôi đã cải thiện câu trả lời được chấp nhận của mình bằng các khoản tín dụng cho @Kenial. Đây vẫn là giải pháp ưa thích cho vấn đề này.
nhuộm

12

Đây là một cách khác! (đã thử nghiệm trên Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)

Giải pháp tốt vì điều này sẽ trả về URL băm nếu DEBUG được đặt thành Sai. Tùy chọn buộc URL băm như vậy: staticfiles_storage.url(path, force=True)
Marc Gibbons

7

Sử dụng staticthẻ mặc định :

from django.templatetags.static import static
static('favicon.ico')

Có một thẻ khác trong django.contrib.staticfiles.templatetags.staticfiles(như trong câu trả lời được chấp nhận), nhưng nó không được dùng trong Django 2.0+.


6

Từ Django 3.0 bạn nên sử dụng from django.templatetags.static import static:

from django.templatetags.static import static

...

img_url = static('images/logo_80.png')

5

Câu trả lời của @ dyve không hoạt động với tôi trong máy chủ phát triển. Thay vào đó tôi đã giải quyết nó với find. Đây là chức năng:

from django.conf import settings
from django.contrib.staticfiles.finders import find
from django.templatetags.static import static

def get_static(path):
    if settings.DEBUG:
        return find(path)
    else:
        return static(path)

1

Nếu bạn muốn nhận url tuyệt đối (bao gồm giao thức, máy chủ và cổng), bạn có thể sử dụng request.build_absolute_urichức năng được hiển thị như bên dưới:

from django.contrib.staticfiles.storage import staticfiles_storage
self.request.build_absolute_uri(staticfiles_storage.url('my-static-image.png'))
# 'http://localhost:8000/static/my-static-image.png'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.