django

2015-11-30 6 views
8

में एक ब्लॉग पोस्ट में एकाधिक छवियों को अपलोड करने के लिए कैसे मैं प्रत्येक उपयोगकर्ता को एक ब्लॉग पोस्ट में एकाधिक चित्र अपलोड करने की अनुमति देने की कोशिश कर रहा हूं। मैं कुछ दिनों के लिए ऐसा करने का सबसे अच्छा तरीका काम करने की कोशिश कर रहा हूं। ऐसा करने का सबसे अच्छा अभ्यास क्या है?django

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

फ़ोटो संग्रहीत करने के लिए सर्वोत्तम प्रथाओं पर कोई सलाह भी स्वागत है। मैंने अमेज़ॅन एस 3 और क्लाउडिनरी को देखा है। मैं कुछ ऐसा बनाना चाहता हूं जो स्केलेबल है।

किसी भी मदद की बहुत सराहना की जाएगी!

+0

एक तरह से कोशिश छवि अपलोड http://koensblog.eu/blog/7/multiple-file-upload-django/ या अन्य तरीका django-ckeditor का उपयोग कर रहा है और इसकी छवि अपलोड प्लगइन का उपयोग करें, जहां छवि आपके अमेज़ॅन एस 3 स्टोरेज पर अपलोड की गई है और केवल img टैग आपकी सामग्री में आपके एस 3 छवि स्थान –

उत्तर

18

आपको केवल दो मॉडल की आवश्यकता होगी। पोस्ट के लिए एक और दूसरा छवियों के लिए होगा। आपकी छवि मॉडल पोस्ट मॉडल के लिए एक foreignkey होगा:

class Post(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=128) 
    body = models.CharField(max_length=400) 

def get_image_filename(instance, filename): 
    title = instance.post.title 
    slug = slugify(title) 
    return "post_images/%s-%s" % (slug, filename) 



class Images(models.Model): 
    post = models.ForeignKey(Post, default=None) 
    image = models.ImageField(upload_to=get_image_filename, 
           verbose_name='Image',) 

आप एक मॉडल के लिए एक फार्म बनाने की जरूरत है, लेकिन वे के रूप में एक दूसरे से संबंधित हो जाएगा, जब उपयोगकर्ता प्रपत्र पोस्ट वह को भरना है भी इस पद के लिए छवि पत्र को पूरा करने के लिए सफलतापूर्वक तैनात किया जाना है, और हम करूं कि विचारों में है, लेकिन अब के लिए अपने प्रपत्र अब इस सब कुछ का सबसे महत्वपूर्ण हिस्सा है इस

class PostForm(forms.ModelForm): 
    title = forms.CharField(max_length=128) 
    body = forms.CharField(max_length=245, label="Item Description.") 

    class Meta: 
     model = Post 
     fields = ('title', 'body',) 


class ImageForm(forms.ModelForm): 
    image = forms.ImageField(label='Image')  
    class Meta: 
     model = Images 
     fields = ('image',) 

की तरह कुछ देख सकते हैं , विचार, क्योंकि यह वह जगह है जहां एक ही जादू में एकाधिक छवियां अपलोड होती हैं। हमारे लिए एक साथ कई छवियों को अपलोड करने में सक्षम होने के लिए, हमें कई छवि फ़ील्ड सही चाहिए? यही वह जगह है जहां आप Django formsets से प्यार करते हैं। हम Django formsets नेड, ऐसा करने के लिए होगा आप Django दस्तावेज में formsets, जो मैं लिंक कर लिया है :) लेकिन यहाँ आपके विचार की तरह दिखना चाहिए कैसे है के बारे में पढ़ सकते हैं:

@login_required 
def post(request): 

    ImageFormSet = modelformset_factory(Images, 
             form=ImageForm, extra=3) 

    if request.method == 'POST': 

     postForm = PostForm(request.POST) 
     formset = ImageFormSet(request.POST, request.FILES, 
           queryset=Images.objects.none()) 


     if postForm.is_valid() and formset.is_valid(): 



      post_form = postForm.save(commit=False) 
      post_form.user = request.user 
      post_form.save() 

      for form in formset.cleaned_data: 
       image = form['image'] 
       photo = Images(post=post_form, image=image) 
       photo.save() 
      messages.success(request, 
          "Yeeew,check it out on the home page!") 
      return HttpResponseRedirect("/") 
     else: 
      print postForm.errors, formset.errors 
    else: 
     postForm = PostForm() 
     formset = ImageFormSet(queryset=Images.objects.none()) 
    return render(request, 'index.html', 
        {'postForm': postForm, 'formset': formset}, 
        context_instance=RequestContext(request)) 

ध्यान में रखते हुए हम हो रही है हमारे दोनों रूपों, और दृश्य दोनों रूपों की जांच करेंगे यदि वे मान्य हैं। इस तरह उपयोगकर्ता को फॉर्म भरना होगा और सभी छवियों को अपलोड करना होगा जो इस मामले में 3 extra=3 हैं। तभी पोस्ट सफलतापूर्वक बनाया जाएगा।

आप टेम्पलेट इस तो तरह दिखना चाहिए:

<form id="post_form" method="post" action="" 
     enctype="multipart/form-data"> 

    {% csrf_token %} 
    {% for hidden in postForm.hidden_fields %} 
     {{ hidden }} 
    {% endfor %} 

    {% for field in postForm %} 
     {{ field }} <br /> 
    {% endfor %} 

    {{ formset.management_form }} 
    {% for form in formset %} 
     {{ form }} 
    {% endfor %} 


    <input type="submit" name="submit" value="Submit" /> 
</form> 
+0

पर उचित पते के साथ डाला गया है धन्यवाद इसके लिए बहुत कुछ! आप ड्रैग और ड्रॉप सिस्टम जैसे ड्रॉपज़ोन जेएस को कैसे शामिल करेंगे? यदि आप ड्रैग और ड्रॉप विधि चाहते हैं तो क्या आपको फॉर्मेट की आवश्यकता है? – ollysmall

+0

@ollysmall क्षमा करें मैं आपकी मदद नहीं कर सकता, मैं जावास्क्रिप्ट से अनजान हूं इसलिए मैं आपको यह नहीं बता सकता कि आप इसे कैसे करेंगे। लेकिन इसे जांचें https://github.com/sigurdga/django-jquery-file-upload मैंने जो कुछ भी आप पूछ रहे हैं उसे करने की कोशिश की और मुझे django jquery फ़ाइल अपलोड मिली, लेकिन मुझे नहीं पता था कि इसके साथ कैसे खेलना है और इसके लिए फॉर्मेट्स के साथ काम करने के लिए। इसे शायद कोशिश करें? – qasimalbaqali

+0

@ qasimalbaqali मुझे पार्टी के लिए देर हो चुकी है, लेकिन मेरे यहां थोड़ा अलग मुद्दा है [मेरा प्रश्न] (https://stackoverflow.com/questions/44159559/need-to-have-a-required-and-optional- फ़ील्ड-इन-डीजेंगो-फॉर्मेट) यहां।उम्मीद है कि आप इसे ठीक करने में मेरी मदद कर सकते हैं – dungu

-4

आप कुछ आदानों नाम = Image1 नाम है = Image2 नाम अपने खाके में = Image3 आदि कई जोड़ने की इस

for i in xrange(1,4): 
     if ('image'+str(i)) in request.FILES: 
      image = request.FILES.get('image'+str(i), None) 
      if image.content_type == 'image/jpeg' 
       image._set_name(str(description.id)+'_image'+str(i)+'.jpg') 
       photo = Images(description=description, image=image) 
       photo.save()