하루일문
[Django] multi image 넣기 본문
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 |