2011-01-12 14 views
5

मैं निम्नलिखित मॉडल हैं:Django में एक संपादन फ़ॉर्म में एक छवि को बांधने के लिए कैसे?

class Listing(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Title") 
    images = models.ManyToManyField('Image') 

, ManyToManyField के साथ इस Image वर्ग को जोड़ने:

class Image(models.Model): 
    thumb = ImageField(upload_to='images/uploads/') 
    number = models.PositiveSmallIntegerField() 

और एक इसी ModelForm तो जैसे:

class ListingEditForm(ModelForm): 
    image1 = ImageField(required=False, label="Photo 1") 
    image2 = ImageField(required=False, label="Photo 2") 
    image3 = ImageField(required=False, label="Photo 3") 

    class Meta: 
     model = Listing 
     exclude = ('images') 

विचार करने के लिए है बीए में Listing से जुड़े चित्रों की संख्या को सीमित न करें ckend, लेकिन इस समय मुझे केवल फॉर्म में 3 छवियों की आवश्यकता है। छवियों को अपलोड करना ठीक काम करता है, लेकिन आप फॉर्म को Listing उदाहरण में बाध्य करने के बारे में कैसे जाएंगे ताकि जब कोई संपादन फ़ॉर्म देखता है तो छवियां 'कोई नहीं' नहीं होतीं?

जाहिर है, इस अकेले काम नहीं करेगा, क्योंकि image1, image2 और image3 केवल प्रपत्र फ़ील्ड्स मॉडल का हिस्सा हैं, और नहीं:

form = forms.ListingEditForm(instance=listing) 

तो एक शब्दकोश जोड़ने पहले पैरामीटर स्पष्ट की तरह लगता है के रूप में बात करने के लिए:

form = forms.ListingEditForm({'image1': ...},instance=listing) 

लेकिन वह ... का मूल्य क्या होना चाहिए? और मैं इसे Listing उदाहरण से कैसे प्राप्त करूं?

उत्तर

2

मैं अपने स्वयं के प्रश्न का उत्तर दूंगा, भले ही यह काफी जवाब नहीं है जिसे मैं ढूंढ रहा था। मैंने चारों ओर देखा है, और जहां तक ​​मुझे पता है, फ़ाइल इनपुट फ़ील्ड की सामग्री को बदलने के लिए HTML में कोई विश्वसनीय तरीका नहीं है। इसलिए, मैं गलत हो सकता था, लेकिन अगर आप अनुरोध के साथ उस जानकारी को भेजते हैं, तो Django के पास क्षेत्र में जानकारी दिखाने का कोई तरीका नहीं होगा (क्योंकि यह स्थानीय पीसी पर एक फाइल के अनुरूप नहीं है)।

तो, मेरे समाधान बस, अनुरोध के साथ छवियों के यूआरएल भेजने के लिए है के रूप में एक सामान्य:

return render_to_response('edit.html', {'image1': image1_url, ...}) 

तो फिर, अगर इस जानकारी मौजूद है, मैं jQuery का उपयोग छवियों जगह के बगल में टेम्पलेट में फ़ाइल इनपुट फ़ील्ड, और यदि उपयोगकर्ता एक नई फ़ाइल का चयन करता है तो उसे अपडेट करें। यह सबसे अच्छा नहीं है, लेकिन यह काम करता है।

मुझे अभी भी कोई अन्य समाधान सुनने में खुशी होगी।

0

मैं छवि उत्पन्न करने के लिए छवि में विदेशी कुंजी संबंध और इनलाइनफॉर्मसेट_फैक्टरी का उपयोग करता हूं।

ListingEditForm = inlineformset_factory(Listing, Image, max_num=3, extra=0)

मैं भी छवि मॉडल में छवि नाम क्षेत्र जोड़ना होगा। इस तरह उपयोगकर्ता को फॉर्म डिस्प्ले में अपलोड की गई फाइलों का संकेत मिलेगा, और अगर वह ऐसा करता है तो वह छवियों को भी हटा पाएगा। आप असीमित अपलोड की जरूरत है तो आप बस करने के लिए 1.

पाठ्यक्रम कि जिस तरह से आप एक से अधिक लिस्टिंग वस्तु के साथ एक छवि संबद्ध नहीं कर सकते का 0 और अतिरिक्त के MAX_NUM बदल सकते हैं, लेकिन यह है कि छवियों को हटाने के लिए सक्षम होने के लिए अगर आप उपयोगकर्ता की जरूरत है वैसे भी अनुशंसित नहीं है।

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