2012-06-05 11 views
11

मैं फ़ाइल नाम यादृच्छिक होना चाहते हैं और इसलिए मैं upload_to समारोह जो इतनी तरह एक यादृच्छिक फ़ाइल नाम देता है का उपयोग करें:Django: FileField में मूल फ़ाइल नाम कैसे सहेजें?

from uuid import uuid4 
import os 
def get_random_filename(instance, filename): 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (str(uuid4()), ext) 
    return os.path.join('some/path/', filename) 

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 

हालांकि मैं मॉडल मौजूद विशेषता करने के लिए मूल फ़ाइल नाम को बचाने के लिए करना चाहते हैं। ऐसा कुछ काम नहीं करता है:

def get_random_filename(instance, filename): 
    instance.filename = filename 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (str(uuid4()), ext) 
    return os.path.join('some/path/', filename) 

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 
    filename = models.CharField(max_length=128) 

मैं यह कैसे कर सकता हूं?

धन्यवाद।

+0

यह मेरे परीक्षणों में पूरी तरह से ठीक काम करता है। यह वास्तव में आपके लिए कैसे काम नहीं करता है? क्या होता है? शायद समस्या कोड में समस्या है? – rantanplan

+0

एक बार जब आप ऐसा करते हैं और ऑब्जेक्ट को डीबी से पूछते हैं, तो क्या आप अभी भी फ़ाइल नाम के लिए मान देखते हैं? – miki725

+0

हां। मैंने वास्तव में इसे खोल के अंदर परीक्षण किया। मैंने इसे मार दिया, इसे फिर से लॉन्च किया और फ़ाइल नाम वहां था। दरअसल मैंने पहले सोचा था कि आप get_random_filename के अंदर 'instance.save() 'करना भूल गए हैं। लेकिन ऐसा लगता है कि इसकी आवश्यकता नहीं है। – rantanplan

उत्तर

8

पोस्ट कोड सामान्य रूप से काम करता है, शायद वास्तविक कोड ऊपर क्षेत्रों के आदेश का स्विचिंग है

class FooModel(models.Model): 
    filename = models.CharField(max_length=128) 
    file = models.FileField(upload_to=get_random_filename) 

नोट।

इसका कारण यह है काम नहीं करेगा: upload_to()pre_save(), here in the code, जब FileField के वास्तविक मूल्य के लिए आवश्यक है द्वारा लाया जाता है। आप पाएंगे कि upload() में विशेषता filename को असाइनमेंट एसक्यूएल में पहले पैरा filename के निर्माण के बाद है। इस प्रकार, असाइनमेंट जेनरेट किए गए एसक्यूएल में प्रभावी नहीं होता है और केवल इंस्टेंस को ही प्रभावित करता है।

यदि यह समस्या नहीं है, तो कृपया आपके द्वारा टाइप किए गए कोड को पोस्ट करें।

+0

Thats जगह पर सही था। मैंने बिना किसी एहसास के सवाल में मूल कोड को दोबारा हटा दिया कि मैंने आदेश को उलट दिया। बहुत बहुत धन्यवाद!!!!! – miki725

+0

और थेंक्स यह इंगित करने के लिए कि यह कहां हो रहा था। मैं खेतों और मॉडल कोड के माध्यम से खोद रहा था लेकिन एसक्यूएल में देखने के बारे में नहीं सोचा था। – miki725

+0

ऐसा लगता है कि Django 1.5 के साथ टूटा हुआ है ... मुझे 'सुपर (FooModel, स्वयं) जोड़ने के लिए मजबूर किया गया था।सहेजें (update_fields = ['filename']) 'मेरे मॉडल में ओवरराइड विधि को सहेजें। कोई विचार ? – dulaccc

1

आप सहेजने की प्रक्रिया के दौरान फ़ाइल नाम को पॉप्युलेट करने का मार्ग जा सकते हैं। स्पष्ट रूप से आपको मूल फ़ाइल नाम को स्मृति में संग्रहीत करना होगा जब आपका get_random_filename चलता है।

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 
    filename = models.CharField(max_length=128) 

    def save(self, force_insert=False, force_update=False): 
     super(FooModel, self).save(force_insert, force_update) 
      #Do your code here... 
+0

मुझे इस बारे में क्या पसंद नहीं है यह है कि बचाओ को दो बार होना होगा। मैं कुछ neater पसंद करेंगे। – miki725

-1

बस अपने आदेशों को फिर से ऑर्डर करें। https://docs.djangoproject.com/en/dev/topics/db/models/

def save(self, *args, **kwargs): 
     do_something() 
     super(Blog, self).save(*args, **kwargs) # Call the "real" save() method. 
     do_something_else() 
+1

ने एक और प्रश्न के लिए उत्तर दिया? – okm

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