코딩한걸음
728x90
반응형

Today I Learned


어떤 문제가 있었는지

TIL 다 썼는데 수정하다가 삭제눌러서 다시씀 ㅠㅠㅠㅠㅠㅠㅠ

 

장고 프로젝트에 이미지파일을 추가하고 싶었음


내가 시도해 본 것들

## main/settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = 'media/'

먼저 settings.py에 media 루트와 경로를 설정

 

## main/urls.py
from django.contrib import admin
from django.urls import path,include
from django.conf import settings
from django.conf.urls.static import static
from django.views.generic import TemplateView

urlpatterns = [
    path('', TemplateView.as_view(template_name="account.html")),
    path("admin/", admin.site.urls),
    path('user/',include('user.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urls.py에 media 경로 를 추가

 

근데 urls.py가 이미지 파일을 사용할 app의 urls.py가 아니라

프로젝트의 메인 urls.py였다..  이거때문에 조금 고생함


어떻게 해결 했는지

그 이후론 탄탄대로

 

## user/models.py
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    subscript = models.CharField("유저소개문(짧게)", max_length=200, blank=True)
    profile_image = models.ImageField("유저이미지", upload_to='profile_images/', blank=True, null=True)
    follows = models.ManyToManyField(
        'self', through='Follow', related_name='follwers', symmetrical=False)

모델 설정, 이미지필드는 유저에따라 사용하지 않을수도 있으니 공백과 null값을 허용해주는게 좋다

 

## user/forms.py
class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['subscript','profile_image']

장고 프로젝트 하면서 익숙해진 폼을 만들어주고

 

## user/views.py
@login_required
def user_mypage_update(request):
    if request.method == 'POST':
        form = UserUpdateForm(request.POST, instance=request.user)
        profileform = ProfileForm(request.POST, request.FILES, instance=request.user.profile)

        if form.is_valid() and profileform.is_valid():
            form.save()
            profileform.save()
            messages.success(request, '프로필이 업데이트 되었습니다!')
            return redirect('/user/mypage')
    else:
        user_form = UserUpdateForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'user/mypage_update.html', {'form': user_form, 'profileform': profile_form})

프로필 업데이트 할 views.py를 설정해주고

 

## templates/user/mypage.html
{% block content %}
<h1>마이페이지</h1>
{% if user.profile.profile_image %}
    <img src="{{ user.profile.profile_image.url }}" alt="프로필 이미지">
{% else %}
    <img src="{% static 'default_profile_image.jpg' %}" alt="기본 프로필 이미지">
{% endif %}

html에서 프로필 이미지를 보여주면 끝 !


무엇을 새롭게 배웠는지

장고에서 이미지를 보여주는 과정과 특성을 배웠다

장고는 db에 과부하를 주는 이미지나 파일들을 직접 저장하지 않고, 경로만 저장한다

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!