Django CRUD - 9. Update(2)

Mingi Shin·2023년 2월 20일
0

CRUD

목록 보기
10/11
post-custom-banner

Update 기능을 다시 짜보겠다.

삭제 기능은 다음 POST에..


1. Semester Update

먼저 학기 정보에 대한 수정 버튼을 만들어보자.

(1) Update 버튼 생성

<!-- 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에서 이루어질 것이다.

(2) URL 매핑

# sju/urls.py

(...생략...)

urlpatterns =[
	path('semester/update/<int:sem_id>/',
    	views.semester_update, name="semester_update"),
]

(...생략...)

(3) Views 함수 정의

# 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로 페이지 이동하게 한다.


2. Subjects Update

(1) Update 버튼 생성

<!-- 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>

(2) URL 매핑

# sju/urls.py

path('subject/update/<int:sub_id>/', 
	views.subject_update, name='subject_update'),

(3) Views 함수 정의

# 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를 인자로 전달하는 것이 차이점이다.

profile
@abcganada123 / git:ABCganada
post-custom-banner

0개의 댓글