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
반응형