하루일문

[Django] multi image 넣기 본문

django

[Django] multi image 넣기

support_u 2023. 5. 2. 17:11

1. 글에 다수에 사진을 넣기때문에 M:M 관계 지정

models.py

class ArticleImage(models.Model):
	# 외래키로 설정
    article = models.ForeignKey(Article, null=True, blank=True, on_delete=models.CASCADE)

    def article_image_path(instance, filename):
        return f'articles/{instance.article.pk}/{filename}'
    # blank=True, null = True 필수
    image = ProcessedImageField(blank=True,
                                upload_to = article_image_path,
                                processors= [ResizeToFill(200, 200)],
                                format='JPEG',
                                options={'quality' : 90},
                                null = True,
                                )
    # 사진 삭제
    def delete(self, *args, **kargs):
        if self.image:
            os.remove(os.path.join(settings.MEDIA_ROOT, self.image.name))
            dir_path = os.path.dirname(os.path.join(settings.MEDIA_ROOT, self.image.name))
            if not os.listdir(dir_path):
                os.rmdir(dir_path)
        super(ArticleImage, self).delete(*args, **kargs)

 

2. forms.py 설정

class ArticleImageForm(forms.ModelForm):
    image = forms.ImageField(
        label='Image',
        required=False,
        widget=forms.ClearableFileInput(
            attrs={
            'multiple': True,
            'class': 'form-control'
            }
        )
    )
    class Meta:
        model = ArticleImage
        fields = ('image',)

 

3. veiws.py에서 이미지를 받을 수 있도록 수정

@login_required
def create(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        # 이미지 파일들을 받음
        images = request.FILES.getlist('image')
        if form.is_valid():
            article = form.save(commit=False)
            article.user = request.user
            article.save()
            # 이미지 파일을 하나씩 품
            for i in images:
            	# model에 이미지를 넣어줌
                ArticleImage.objects.create(article=article, image=i)
            return redirect('articles:index')       
        else:
            print(form.errors)
    else:
        form = ArticleForm()
        imageform = ArticleImageForm()
    context = {
        'form': form,
        'imageform' : imageform

    }
    return render(request, 'articles/create.html', context)

 4. templates에 이미지를 불어와줌

  {% for image in article.articleimage_set.all %}
    <img src="{{image.image.url}}" alt="img">
  {% endfor %}

'django' 카테고리의 다른 글

[Django] M:M 정렬  (0) 2023.05.03
[Django] 게시글에 태그 붙이기  (0) 2023.05.03
[django] 소셜로그인(카카오)  (0) 2023.05.02
[Django] 여러 감정 표현하기  (0) 2023.05.01
[django] 검색을 해보자  (0) 2023.04.27