2015-02-06 4 views
5

मैं Django 1.7 में कैशस्टैटिकफाइल स्टोरेज बैकएंड का उपयोग कर रहा हूं और व्यवस्थापक इंटरफ़ेस में स्थिर फ़ाइलों के साथ समस्या है।मॉडलएडमिन मीडिया में Django कैशस्टैटिकफाइल स्टोरेज

ModelAdmin कक्षा में, आप Media कक्षा को स्थिर फ़ाइलों के साथ जोड़/परिवर्तन दृश्यों में जोड़ने के लिए परिभाषित कर सकते हैं। इन फ़ाइलों में हैश लागू करने के लिए, मैं static फ़ंक्शन का उपयोग django.contrib.staticfiles.templatetags.staticfiles में कर रहा हूं। उदा।

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

class MyAdminClass(admin.ModelAdmin): 

    class Media: 
     js = [ 
      static('app/static_file.js'), 
      static('app/static_file_2.js'), 
     ] 

यह काम करने के लिए प्रतीत होता है, क्योंकि इस बदलाव से पहले स्थैतिक फाइलें पहले से ही एकत्र की गई थीं। ,

ValueError: The file 'app/static_file.js' could not be found with <django.contrib.staticfiles.storage.CachedStaticFilesStorage object at 0x80910a9d0> 

वास्तव में, यदि आप किसी भी Django आदेश नहीं चला सकते हैं के रूप में यह व्यवस्थापक ऐप्स लोड करने के लिए कोशिश करता है और यह जब विफल रहता है: लेकिन, जब मैं स्थिर फ़ाइलों को हटा दें और collectstatic चलाने के लिए यह त्रुटि के साथ विफल प्रयास यह स्थिर फ़ाइल पर static कमांड चलाने की कोशिश करने के बिंदु पर पहुंच जाता है जिसे अभी तक एकत्र नहीं किया गया है।

क्या किसी के पास इस तरह के किसी भी तरीके का कोई विचार है?

+2

मैं भी इसमें भाग गया। ऐसा लगता है कि Django टीम इसके लिए एक फिक्स पर काम कर रही है। https://github.com/django/django/pull/5571/files –

+2

यहां टिकट है: https://code.djangoproject.com/ticket/21221 –

उत्तर

1

मुझे इस समस्या का समाधान मिला, अगर कोई और इस मुद्दे पर आता है। आप मीडिया क्लास को वापस करने और मीडिया के लोडिंग को स्थगित करने के लिए ModelAdmin क्लास पर मीडिया प्रॉपर्टी सेट कर सकते हैं।

from django.forms import Media 

@property 
def media(self): 
    js = [ 
     'app/static_files.js', 
     'app/static_files_2.js', 
    ] 

    return Media(js=[static(path) for path in js]) 
+0

एक ही समस्या है और मेरे लिए कामकाज काम करता है। निश्चित नहीं है कि यह बग के रूप में रिपोर्ट करने लायक है क्योंकि टेम्पलेट फ़ाइलों के बाहर 'स्थिर' टैग के उपयोग के लिए दस्तावेज नहीं है। – Stan

+0

मैं बहुत उत्साही रहा हूँ! यह समाधान फ़ील्ड के मीडिया को प्रस्तुत नहीं करता है। – Stan

1

यहाँ एक टुकड़ा ओ पी के एक से प्रेरित है कि विजेट से मीडिया प्रबंधन:

from django.contrib.admin.templatetags.admin_static import static 
from django.forms import Media 

def get_cached_media(form, js, css): 
    """Fix collectstatic when using CachedStaticFilesStorage """ 
    media = Media(js=[static(path) for path in js], 
       css=dict([ 
        (key, [static(path) for path in paths]) 
        for key, paths in css.items() 
       ])) 
    if form.fields: 
     for field in form.fields.values(): 
      media = media + field.widget.media 
    return media 

आपको लगता है कि आपके रूपों में की तरह उपयोग कर सकते हैं कि: में

class MyForm(forms.ModelForm): 
    # fields 

    @property 
    def media(self): 
     js = ['my/js/stuffs.js'] 
     css = { 
      'all': (
       'my/css/forms.css', 
       'my/css/stuffs.css', 
      ) 
     } 
     return get_cached_media(self, js, css) 

ताकि अपने टेम्पलेट, यदि आप {{ my_form.media }} टैग का उपयोग करते हैं, तो विगेट्स से मीडिया भी प्रस्तुत किया जाएगा।

संबंधित मुद्दे