Django รับ URL ไฟล์คงที่ในมุมมอง


137

ฉันใช้ reportlab pdfgen เพื่อสร้าง PDF ใน PDF มีภาพที่สร้างโดยdrawImage. สำหรับสิ่งนี้ฉันต้องการ URL ไปยังรูปภาพหรือเส้นทางไปยังรูปภาพในมุมมอง ฉันสามารถสร้าง URL ได้ แต่ฉันจะหาเส้นทางภายในไปยังรูปภาพได้อย่างไร

ฉันจะรับ URL ได้อย่างไร:

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

คำตอบ:


291

เนื่องจากนี่เป็นผลลัพธ์อันดับต้น ๆ ใน Google ฉันจึงคิดว่าจะเพิ่มวิธีอื่นในการดำเนินการนี้ โดยส่วนตัวแล้วฉันชอบอันนี้เนื่องจากมันออกจากการนำไปใช้กับเฟรมเวิร์ก 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
คุณทราบหรือไม่ว่ามีวิธีเพิ่มชื่อโฮสต์ให้กับ URL แบบคงที่ (หากไม่มีอยู่ใน STATIC_URL) ฉันต้องการเพิ่มรูปภาพหรือทรัพยากรอื่น ๆ ในอีเมลซึ่งผู้ใช้จะไม่สามารถค้นหาทรัพยากรที่มี URL ที่เกี่ยวข้องได้
gepatino

4
สิ่งนี้ใช้ไม่ได้สำหรับฉันในขณะที่ทำงานใน Debug (ยังไม่ได้ลองใช้ DEBUG = False) ฉันแค่ได้รับเส้นทางที่ส่งผ่านไปยังวิธีการคงที่กลับ ใช้ Django 1.6 ความคิดใด ๆ ?
Shawn

ฉันคิดว่าควรใช้รหัสที่ใช้ django.contrib.staticfiles.templatetags.staticfiles โดยคำนึงว่าเข้ากันได้กับ django-storages และสิ่งที่คล้ายกัน
jdcaballerov

@gepatino คุณสามารถกำหนดเส้นทางของผลลัพธ์request.build_absolute_uriตามที่อธิบายไว้ที่นี่: stackoverflow.com/questions/2345708/…
dyve

22
ใน Django 2.0 จะแสดงการแจ้งเตือนการเลิกใช้งาน ใช้from django.templatetags.static import staticแทน
Flimm

88

คำตอบของ dyve เป็นคำตอบที่ดีอย่างไรก็ตามหากคุณใช้ "ที่เก็บแคช" ในโครงการ django ของคุณและเส้นทาง URL สุดท้ายของไฟล์คงที่ควรได้รับ "แฮช" (เช่นstyle.aaddd9d8d8d7.cssจากstyle.css ) แสดงว่าคุณ ไม่สามารถรับ URL django.templatetags.static.static()ที่แม่นยำด้วย แต่คุณต้องใช้แท็กเทมเพลตจากdjango.contrib.staticfilesเพื่อรับ URL ที่แฮช

นอกจากนี้ในกรณีของการใช้เซิร์ฟเวอร์การพัฒนาเมธอดแท็กเทมเพลตนี้จะส่งคืน url ที่ไม่ได้แฮชดังนั้นคุณจึงสามารถใช้โค้ดนี้ได้ไม่ว่าโฮสต์นั้นจะกำลังพัฒนาหรือใช้งานจริงก็ตาม! :)

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
ขอบคุณสำหรับสิ่งนี้ ... ฉันใช้เวลาสักพักเพื่อหาสาเหตุที่ฉันไม่ได้รับการฉีดแฮช md5 ของฉัน
ilovett

4
คำตอบนี้ยังคงได้รับความนิยมและมีการใช้งานอยู่ดังนั้นฉันจึงปรับปรุงคำตอบที่ยอมรับโดยให้เครดิตกับ @Kenial นี่ยังคงเป็นทางออกที่ดีสำหรับปัญหานี้
dyve

13

นี่เป็นอีกวิธีหนึ่ง! (ทดสอบกับ Django 1.6)

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

ทางออกที่ดีเนื่องจากจะส่งคืน URL ที่แฮชหากตั้งค่า DEBUG เป็น False สามารถบังคับ URL ที่แฮชได้ดังนี้: staticfiles_storage.url(path, force=True)
Marc Gibbons

8

ใช้staticแท็กเริ่มต้น:

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

มีแท็กอื่นในdjango.contrib.staticfiles.templatetags.staticfiles(เช่นเดียวกับในคำตอบที่ยอมรับ) แต่เลิกใช้แล้วใน Django 2.0+


8

จาก Django 3.0 คุณควรใช้from django.templatetags.static import static:

from django.templatetags.static import static

...

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

5

คำตอบของ @ dyve ไม่ได้ผลสำหรับฉันในเซิร์ฟเวอร์การพัฒนา แต่ฉันแก้ไขด้วยfind. นี่คือฟังก์ชั่น:

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

หากคุณต้องการรับ URL ที่สมบูรณ์ (รวมถึงโปรโตคอลโฮสต์และพอร์ต) คุณสามารถใช้request.build_absolute_uriฟังก์ชันที่แสดงด้านล่าง:

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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.