2015-11-30 4 views
8

Я пытаюсь разрешить каждому пользователю загружать несколько изображений в одно сообщение в блоге. Я пытался разработать лучший способ сделать это в течение нескольких дней. Какова наилучшая практика?Как загрузить несколько изображений в сообщение в блоге django

Из того, что я прочитал, я должен сделать отдельную модель изображения из модели блога и использовать внешний ключ. Это правильно? . Тогда возникает вопрос, как разрешить им одновременно загружать несколько изображений. Правильно ли я предполагаю, что я должен использовать что-то вроде зоны падения?

Любые советы по наилучшим методам хранения фотографий также приветствуются. Я посмотрел на Amazon s3 и облачный. Я хочу создать что-то масштабируемое.

Любая помощь была бы высоко оценена!

+0

Одним из способов добавления нескольких загрузка изображения http://koensblog.eu/blog/7/multiple-file-upload-django/ или другим способом использует django-ckeditor и использует один из плагинов для загрузки изображений, где изображение загружается в хранилище amazon s3 и только img помещается в ваш контент с правильным адресом в ваше местоположение изображения s3 –

ответ

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. Мы определены Джанго FormSets, чтобы это произошло, вы можете прочитать о FormSets в документации Django, который я связавший :) Но вот как ваш взгляд должен выглядеть следующим образом:

@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

спасибо так много для этого! как бы вы включили в него систему перетаскивания, такую ​​как dropzone js? Вам нужны формы, если вы хотите использовать метод перетаскивания? – ollysmall

+0

@ollysmall жаль, что я не могу с этим поделать, я не обращаю внимания на Javascript, поэтому я не могу сказать вам, как вы это сделаете. Но проверьте это https://github.com/sigurdga/django-jquery-file-upload. Я попытался выполнить именно то, о чем вы просите, и я нашел загрузку файла jjquo jjjo, но я понятия не имел, как с ним играть и для того, чтобы он работал с наборами форм. Попробуй попробовать? – qasimalbaqali

+0

@ qasimalbaqali Я опаздываю на вечеринку, но у меня есть немного другая проблема здесь [мой вопрос] (https://stackoverflow.com/questions/44159559/need-to-have-a-required-and-optional- fields-in-django-formset) здесь.надеюсь, что вы могли бы помочь мне исправить это. – 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()