UpdateView
accountapp에서 만들었던 updateview를 그대로 복사한다.
class ProfileUpdateView(UpdateView):
model = Profile
context_object_name = 'targat_profile'
form_class = ProfileCreationForm
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'profileapp/update.html'
Python
복사
url path도 라우팅 해준다
path('update/<int:pk>', ProfileUpdateView.as_view(), name = 'update'),
Python
복사
update.html도 account에서 가져온다.
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div style = "text-align: center; max-width: 600px; margin: 4rem auto">
<div class="mb-4">
<h4>Update Profile</h4>
</div>
<form action="{% url 'profileapp:update' pk=target_profile.pk %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
</form>
</div>
{% endblock %}
Python
복사
Update Profile로 바꿔주고, url ‘profileapp:update’ pk=target_profile.pk 로 바꿔준다
form action에서도, 사진을 받아야하니 enctype=”multipart/form-data”로 만들어준다.
detatil view에서도 profile을 수정하는 링크를 라우팅해준다.
<a href=”url ‘profileapp:update’ pk=target_user.profile.pk”>
edit
</a>
Python
복사
detail에서 프로필의 이미지도 볼 수 있게 해준다.
<img src="{{ target_user.profile.image.url }}" alt="">
Python
복사
위와 같이 입력하면 라우팅을 안 해놔서 사진이 안 나온다.
settings.py에서 media 라우팅을 해준걸 pragmatic/urls.py에서 라우팅을 해줘야한다.
from django.conf.urls.static import static
from django.conf import settings
path('profile/', include('profileapp.urls')),
] + static(settings.MEDIA_URL, document_root=setting.MEDIA_ROOT)
Python
복사
profile message도 detail에서 출력해준다.
<h5>
{{ target_user.profile.message }}
</h5>
Python
복사
Profile Decorator
from django.http import HttpResponseForbidden
def profile_ownership_required(func):
def decorated(request, *args, **kwargs):
profile = Profile.objects.get(pk=kwargs['pk])
if not profile.user ==request.user:
return HttpResponseForbidden
return func(request, *args, **kwargs)
return decorated
Python
복사
view단에서 똑같이 method_decorator로 보안사항을 등록해준다.