2015-11-30 13 views
8

Her kullanıcının tek bir blog yayına birden fazla resim yüklemesine izin vermeye çalışıyorum. Bunu birkaç günlüğüne yapmanın en iyi yolunu bulmaya çalışıyorum. Bunu yapmak için en iyi uygulama nedir?django adresindeki blog yazıya birden çok resim yükleme

Okuduklarımdan, blog post modelinden ayrı bir görüntü modeli yapmalı ve bir yabancı anahtar kullanmalıyım. Bu doğru mu? Ardından, aynı anda birden fazla resim yüklemelerine nasıl izin verileceği meselesi var. Düşme bölgesi gibi bir şey kullanmalı mıyım?

Fotoğrafların saklanmasıyla ilgili en iyi uygulamalar hakkında herhangi bir öneri de kabul edilir. Amazon s3 ve cloudinary'ye baktım. Ölçeklenebilir bir şey yaratmak istiyorum.

Herhangi bir yardım çok takdir edilecektir!

+0

Tek yön deneyin image upload http://koensblog.eu/blog/7/multiple-file-upload-django/ ya da başka bir yol django-ckeditor kullanıyor ve görüntüyü sadecezon s3 belleğinize yükleyen ve sadece resim yükleme eklentisinden birini kullanıyor img etiketi içeriğinize s3 resim konumunuza uygun adresle eklenir –

cevap

18

Sadece iki modele ihtiyacınız olacak. Post ve diğeri Görüntüler için olacak. kullanıcı formu yazıyı o doldurarak zaman Her model için bir form oluşturmak için gereken

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',) 

, ancak olduğu gibi birbiriyle ilişkili olacaktır: Resminiz modeli Mesaj modeline ForeignKey olurdu bu görev için fazla başarıyla yayınlandı edilecek görüntü formunu doldurmaya vardır ve biz görünümlerinde bunu edecektir ama şimdi ilgili form Şimdi bu her şeyin en önemli parçası olan bu

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',) 

gibi görünebilir Görüntülemeler, çünkü tek bir büyüye birden fazla görüntü yüklüyor. Aynı anda birden fazla resim yükleyebilmemiz için birden fazla resim alanına ihtiyacımız var mı? Django formsets'a aşık olduğunuz yer burası. görünümünde

@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)) 

biz alıyorsanız: Size ben bağlantılı :) Ama burada görünümü gibi görünmelidir nasıl gelmiş Django belgelerinde formsets, okuyabilirsin bunu gerçekleştirmek için django formsets ned olacak Her iki formumuz da, görünüm geçerliyse her iki formu da kontrol edecektir. Bu şekilde, kullanıcı formu doldurmalı ve bu durumda 3 extra=3 olan tüm görüntüleri yüklemelidir. Sadece o zaman posta başarıyla oluşturulur.

Şablon bu o gibi görünmelidir:

<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

bunun için çok fazla! içine dropzone js gibi bir sürükle ve bırak sistemini nasıl dahil edersiniz? Sürükle ve bırak yöntemini istiyorsanız, formlara mı ihtiyacınız var? – ollysmall

+0

@ollysmall Üzgünüz, bu konuda size yardımcı olamam, Javascript'ten habersizim, bu yüzden nasıl yapacağınızı söyleyemem. Ama şunu kontrol et https://github.com/sigurdga/django-jquery-file-upload Tam olarak ne istediğini yapmaya çalıştım ve django jquery dosyası yüklemesini buldum, ama onunla nasıl oynayacağımı hiç bilmiyordum ve bunun için formüllerle çalışmak. Bir deneyebilir misin? – qasimalbaqali

+0

@ qasimalbaqali Partiye geç kaldım, ama burada biraz farklı bir sorun var [sorum] (https://stackoverflow.com/questions/44159559/need-to-have-a-required-and-optional- alanları-in-django-formset) burada.Bunu düzeltmeme yardımcı olabileceğini umuyorum – dungu

-4

bazı girişler name = image1 adına sahipse = IMAGE2 name = image3 vb şablonunda birden ekleyerek bu

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() 
İlgili konular