Update 기능을 다시 짜보겠다.
삭제 기능은 다음 POST에..
먼저 학기 정보에 대한 수정 버튼을 만들어보자.
<!-- tempalates/sju/semester_read.html -->
{% extends 'base.html' %}
{% block content %}
<h2>{{sem.table}}</h2>
<div>
이수학점: {{sem.credits}}
</div>
<div>
평점: {{sem.grade}}
</div>
<div>
<a href="{% url 'sju:semester_update' sem.id %}">수정</a>
</div>
(...생략...)
Semester에 대한 수정은 Semester read page에서 이루어질 것이다.
# sju/urls.py
(...생략...)
urlpatterns =[
path('semester/update/<int:sem_id>/',
views.semester_update, name="semester_update"),
]
(...생략...)
# sju/views.py
def semester_update(request, sem_id):
sem = get_object_or_404(Semester, pk=sem_id)
if request.method == "POST":
form = SemesterForm(request.POST, instance=sem)
if form.is_valid():
sem = form.save(commit=False)
sem.update_at = timezone.now()
sem.save()
return redirect('sju:read', sem_id = sem.id)
else:
form = SemesterForm(instance=sem)
context = {'form': form}
return render(request, 'sju/semester_form.html', context)
변수 sem에 Semester 객체를 저장한다. GET 방식으로 함수가 호출될 경우, 기존 Semester 정보를 instance로 하여 semester_form을 렌더링해 수정을 진행한다. 이후 semester_form의 제출버튼을 누르면 POST 방식으로 다시 함수를 타고 들어와 POST method에 대한 if문을 탄다. form에 새로 입력한 정보를 저장하고 sem을 통해 semester를 update해준 후 sju/read/sem_id
로 페이지 이동하게 한다.
<!-- templates/sju/semester_read.html -->
<h5>{{sem.subjects_set.count}}개의 과목을 들었습니다.</h5>
<div>
<ul>
{% for sub in sem.subjects_set.all %}
<li>
{{ sub.name }} ({{sub.credit}}학점)
<a href="{% url 'sju:subject_update' sub.id %}">과목 수정</a>
</li>
{% endfor %}
</ul>
</div>
# sju/urls.py
path('subject/update/<int:sub_id>/',
views.subject_update, name='subject_update'),
# sju/views.py
def subject_update(request, sub_id):
sub = get_object_or_404(Subjects, pk=sub_id)
if request.method == "POST":
form = SubjectsForm(request.POST, instance=sub)
if form.is_valid():
sub = form.save(commit=False)
sub.update_at = timezone.now()
sub.save()
return redirect('sju:read', sem_id=sub.semester.id)
else:
form = SubjectsForm(instance=sub)
context = {'subjects': sub, 'form': form}
return render(request, 'sju/subjects_form.html', context)
Semester_update 함수와 동일한 매커니즘이다. sub_id를 인자로 전달하는 것이 차이점이다.