2009-07-27 13 views
121

मैं अपने अपलोड सेट अप करने की कोशिश कर रहा हूं ताकि यदि उपयोगकर्ता जो फ़ाइल अपलोड करता है तो यह MEDIA_ROOT/जो पर जाता है क्योंकि हर किसी की फाइलें MEDIA_ROOT पर जाती हैं। समस्या यह है कि मुझे नहीं पता कि मॉडल में इसे कैसे परिभाषित किया जाए। यहां बताया गया है कि यह वर्तमान में कैसा दिखता है:रनटाइम पर निर्धारित अपलोड_to के साथ Django FileField

class Content(models.Model): 
    name = models.CharField(max_length=200) 
    user = models.ForeignKey(User) 
    file = models.FileField(upload_to='.') 

तो मैं चाहता हूं कि '।' upload_to के रूप में, यह उपयोगकर्ता का नाम हो।

मैं समझता हूं कि Django 1.0 के रूप में आप upload_to को संभालने के लिए अपना स्वयं का फ़ंक्शन परिभाषित कर सकते हैं लेकिन उस फ़ंक्शन को पता नहीं है कि उपयोगकर्ता कौन होगा या तो मैं थोड़ा खो गया हूं।

सहायता के लिए धन्यवाद! आप रद्द कर सकते थे कि -

def content_file_name(instance, filename): 
    return '/'.join(['content', instance.user.username, filename]) 

class Content(models.Model): 
    name = models.CharField(max_length=200) 
    user = models.ForeignKey(User) 
    file = models.FileField(upload_to=content_file_name) 

आप देख सकते हैं, तो आप भी फ़ाइल नाम दिया उपयोग करने की आवश्यकता नहीं है:

उत्तर

242

आप शायद the documentation पढ़ा है, इसलिए यहाँ एक आसान उदाहरण यह समझ बनाने बनाने के लिए है यदि आप पसंद करते हैं तो भी आपके अपलोड_to कॉल करने योग्य में।

+0

हाँ, शायद यह दस्तावेज़ों में से संबंधित है - यह आईआरसी – SmileyChris

+2

पर एक उचित सवाल है क्या यह मॉडलफॉर्म के साथ काम करता है? मैं देख सकता हूं कि उस उदाहरण में क्लास मॉडल के सभी गुण हैं, लेकिन कोई मान नहीं है (केवल फ़ील्ड नाम का एक स्ट्र)। टेम्पलेट में, उपयोगकर्ता छिपा हुआ है। मुझे एक प्रश्न जमा करना पड़ सकता है, मैं घंटों तक इसे गुगल रहा हूं। – mgag

+0

हां यह काम करता है, और हाँ आपको एक नया प्रश्न पूछना चाहिए (या #django irc पर सहायता मांगना) – SmileyChris

11

इससे वास्तव में मदद मिली। 'उदाहरण' वस्तु की pk मूल्य के प्रयोग पर

file = models.FileField(
    upload_to=lambda instance, filename: '/'.join(['mymodel', str(instance.pk), filename]), 
) 
+2

यह माइग्रेशन का उपयोग करके Django 1.7 में मेरे लिए काम नहीं किया।इसके बजाय एक समारोह बनाने और माइग्रेशन ले लिया। – aboutaaron

+0

भले ही आप str (example.pk) का उपयोग करके काम करने के लिए लैम्ब्डा नहीं प्राप्त कर सकते हैं, भले ही आपको फ़ाइलों को अधिलेखित करने में समस्या हो, जब आप उन्हें नहीं चाहते हैं। –

+0

उदाहरण से पहले सहेजने से पहले 'pk' नहीं है। यह केवल क्रिएशन (आवेषण) के अपडेट के लिए काम करता है। –

3

एक नोट: थोड़ा और संक्षिप्तता के लिए, मेरे मामले में लैम्ब्डा उपयोग करने का फैसला। प्रलेखन के अनुसार:

ज्यादातर मामलों में, यह ऑब्जेक्ट अभी तक डेटाबेस में सहेजा नहीं गया होगा, इसलिए यदि यह डिफ़ॉल्ट ऑटोफ़ील्ड का उपयोग करता है, तो उसके पास अभी भी इसके प्राथमिक कुंजी फ़ील्ड के लिए कोई मान नहीं है।

इसलिए पीके का उपयोग करने की वैधता इस बात पर निर्भर करती है कि आपका विशेष मॉडल कैसे परिभाषित किया गया है।

+0

मुझे कोई भी मूल्य के रूप में नहीं मिला है। मैं इसे ठीक करने का तरीका नहीं समझ सकता। क्या आप थोड़ा विस्तार से समझा सकते हैं। –

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