Django को देखने में स्थिर फ़ाइलों का URL मिलता है


133

मैं पीडीएफ बनाने के लिए Reportlab pdfgen का उपयोग कर रहा हूं। पीडीएफ में इसके द्वारा बनाई गई एक छवि है drawImage। इसके लिए मुझे या तो छवि के लिए URL की आवश्यकता है या दृश्य में किसी छवि के पथ की। मैं URL का निर्माण करने में कामयाब रहा, लेकिन मुझे छवि के लिए स्थानीय रास्ता कैसे मिलेगा?

मुझे URL कैसे मिलेगा:

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

जवाबों:


287

चूंकि यह 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 में मौजूद नहीं है)? मुझे मेलों में चित्र या अन्य संसाधन जोड़ने की आवश्यकता है, जहां उपयोगकर्ता सापेक्ष यूआरएल के साथ संसाधनों को खोजने में सक्षम नहीं होगा।
गेपटिनो

3
डीबग में चलते समय यह मेरे लिए काम नहीं करता है (अभी तक DEBUG = गलत के साथ प्रयास नहीं किया गया है)। मुझे बस स्टैटिक मेथड में दिया गया रास्ता वापस मिलता है। Django 1.6 का उपयोग करना। कोई विचार?
शॉन

मुझे लगता है कि django.contrib.staticfiles.templatetags.staticfiles का उपयोग करने वाले कोड को ध्यान में रखना चाहिए, जो django-storages और समान के साथ संगत है।
jdcaballerov

@gepatino आप request.build_absolute_uriयहां बताए अनुसार परिणाम प्राप्त कर सकते हैं: stackoverflow.com/questions/2345708/…
dyve

17
Django 2.0 में, यह एक पदावनति नोटिस दिखाएगा। from django.templatetags.static import staticइसके बजाय उपयोग करें ।
फ्लिम

86

डाईव का उत्तर अच्छा है, हालांकि, यदि आप अपने django प्रोजेक्ट पर "कैश्ड स्टोरेज" का उपयोग कर रहे हैं और स्टैटिक फ़ाइलों के अंतिम url पथ को " हैशेड " (जैसे कि style.aaddd9d8d8d7.css से style.css ) प्राप्त करना चाहिए , तो आप के साथ एक सटीक url नहीं मिल सकता है django.templatetags.static.static()। इसके बजाय, आपको django.contrib.staticfilesहैशेड यूआरएल प्राप्त करने के लिए टेम्पलेट टैग का उपयोग करना चाहिए ।

इसके अतिरिक्त, विकास सर्वर का उपयोग करने के मामले में, यह टेम्प्लेट टैग विधि गैर-हैशेड 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
इसके लिए धन्यवाद ... मुझे यह पता लगाने में
थोड़ा

4
यह उत्तर अभी भी हिट हो रहा है और सक्रिय रूप से उपयोग किया जाता है, इसलिए मैंने @Kenial को क्रेडिट के साथ अपने स्वीकृत उत्तर में सुधार किया। यह अभी भी इस समस्या का पसंदीदा समाधान है।
डाईव

12

यहाँ एक और तरीका है! (Django 1.6 पर परीक्षण किया गया)

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

यदि DEBUG गलत पर सेट है, तो इसका अच्छा समाधान हैशेड URL लौटाएगा। वैकल्पिक रूप से हैशेड URL को इस तरह से बाध्य करें: staticfiles_storage.url(path, force=True)
मार्क गिबन्स

7

डिफ़ॉल्ट staticटैग का उपयोग करें :

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

इसमें एक और टैग है django.contrib.staticfiles.templatetags.staticfiles(जैसा कि स्वीकृत उत्तर में है), लेकिन इसे Django 2.0+ में चित्रित किया गया है।


6

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'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.