v1.6.1: 출석부의 Update 구현

김의석 ·2024년 3월 31일

Hello! Poko Ver.1

목록 보기
10/20

시범운영 요청사항인 출석부 Update 구현 과정을 기록.
구현 과정을 정리하면서 개발자 스스로 과정에 대한 평가를 하기 위함.

동작정의

첫번째

  • 출석내용을 Update할 학생의 명단에서 check를 클릭

코드 구현

# views.py 

def chk(request):
    if request.method == "POST":
        checked_name = request.POST["name"]
        checked_date = request.POST["date"]
        if Attendance.objects.filter(name=checked_name, date=checked_date).exists():
            noti = Attendance.objects.filter(name=checked_name, date=checked_date)
            poko_image = GetImage.objects.get(pk=3).image.url
            attendance_noti_text = (
                f"{checked_name} 학생은 {noti[0].attendance}으로 확인이 완료 되었습니다!"
            )

            return render(
                request,
                "checking/attendance_noti.html",
                {
                    "attendance_noti_text": attendance_noti_text,
                    "checked_name": checked_name,
                    "checked_date": checked_date,
                    "poko_image": poko_image,
                },
            )
  • 조건문을 통해 check 클릭 한 학생의 출석데이터가 Attendance Model에 있는지 확인 있다면 현재 학생의 출석 상태를 안내하는 문구가 출력되도록 함
if Attendance.objects.filter(name=checked_name, date=checked_date).exists():
  • 수정이 필요한 경우를 위해 학생의 이름과 출석부의 날짜를 render로 templates에 전달

  • 이미 출석 데이터가 있는 경우 알림창으로 조회한 학생의 출석 상태를 안내
  • 안내 된 내용 확인 후 수정이 필요한 경우 수정 클릭
    • 수정 버튼은 아래와 같이 동작함
{% if checked_name and checked_date %}

<form action="/check_modi/" method="get">
    {% csrf_token %}
    <input type="hidden" name="name" value="{{ checked_name }}">
    <input type="hidden" name="date" value="{{ checked_date }}">
    <input type="submit" value="수정" class="btn btn-primary">
</form>
{% endif %}
  • 템플릿 조건문을 통해 checked_name와 checked_date가 있다면
    수정 버튼에 사용되는 form 태그를 출력 함.
    • 수정 버튼은 hidden을 설정하여 checked_name와 checked_date를
      check_modi views에 전달한다.
    • 이때 단순 조회이며 민감한 정보가 아니기 때문에 method="get"으로 요청.
# views.py

def check_modi(request):
    if request.method == "GET":
        checked_name = request.GET["name"]
        checked_date = request.GET["date"]
        print(checked_name, checked_date)
        modi = Attendance.objects.filter(name=checked_name, date=checked_date)
        modi_name = modi[0].name
        modi_date = modi[0].date
        modi_attendance = modi[0].attendance
        poko_image = GetImage.objects.get(pk=3).image.url
        return render(
            request,
            "checking/attendance_noti.html",
            context={
                "modi_name": modi_name,
                "modi_attendance": modi_attendance,
                "modi_date": modi_date,
                "poko_image": poko_image,
            },
        )
  • template에서 전달받은 checked_name과 checked_date를 통해
    def check_modi에서 Attendance model에서 학생의 현재 데이터를 가져온다.

  • 조회한 학생의 이름, 출석부 날짜, 출석상태는 다시 변수로 지정.

    • modi_name = modi[0].name
    • modi_date = modi[0].date
    • modi_attendance = modi[0].attendance
    • template에 전달
  • template은 전달 받은 데이터를 아래 코드를 통해 화면에 출력한다.

{% if modi_attendance and modi_name %}

<form action="/check_modi/" method="post">
    {% csrf_token %}
    <p><input type="text" name="modi_date" value="{{ modi_date }}"></p>
    <p><input type="text" name="modi_name" placeholder={{ modi_name }} value={{ modi_name }}></p>
    <p><input type="text" name="modi_attendance"
              placeholder={{ modi_attendance }} value={{ modi_attendance }}></p>
    <p><input type="submit" class="btn btn-primary"></p>
</form>

{% endif %}
  • 템플릿 조건문을 통해 modi_name과 modi_attendance가 있다면
    학생의 현재 데이터를 아래와 같이 출력하게 함
  • 출석 내용을 수정.
    • modi_attendance는 수정한 출석 내용으로 전달 됨.
    • 예 : 출석 -> 결석
  • 수정 후 method="post"로 action="/check_modi/"에 전달.

# views.py

def check_modi(request):
    if request.method == "POST":
        modied_name = request.POST["modi_name"]
        modied_date = request.POST["modi_date"]
        modied_attendance = request.POST["modi_attendance"]
        modied = Attendance.objects.filter(name=modied_name, date=modied_date)

        if modied.exists():  # 해당하는 객체가 존재하는 경우
            modied_instance = modied.first()  # 필터링된 첫 번째 객체를 가져옵니다.
            modied_instance.attendance = modied_attendance  # attendance 값을 변경합니다.
            modied_instance.save()  # 변경 사항을 저장합니다.
        # print("변경 된 attendance", modied[0].attendance)
        modied_attendance = modied[0].attendance  # 변경된 attendance 재선언
        # referer = request.META.get("HTTP_REFERER")
        attendance_modied_text = (
            f"{modied_name} 학생은 {modied_attendance}으로 수정이 완료 되었습니다!"
        )
  • template에서 post로 전달 받은 modi_name, modi_date, modi_attendance를 변수 지정

    • modied_name = request.POST["modi_name"]
    • modied_date = request.POST["modi_date"]
    • modied_attendance = request.POST["modi_attendance"]
  • Attendance Model의 내용 변경

 modied = Attendance.objects.filter(name=modied_name, date=modied_date) # 필터링 된 모델 데이터 가져오기

if modied.exists():  # 해당하는 객체가 존재하는 경우
	modied_instance = modied.first()  # 필터링된 첫 번째 객체를 가져옵니다.
    modied_instance.attendance = modied_attendance  # attendance 값을 변경합니다.
    modied_instance.save()  # 변경 사항을 저장합니다.
    
    modied_attendance = modied[0].attendance  # 변경된 attendance로 변수 재선언
  • 변경된 출석 데이터를 수정완료 안내문구(attendance_modied_text)와 template에 전달.
{% if attendance_modied_text %}
    <div class="quote-box">
        <h4>알림</h4>
        <p>
            {{ attendance_modied_text }}
        </p>
    </div>
{% endif %}
  • 템플릿 조건문을 통해 attendance_modied_text가 있다면
    수정완료 안내문구가 출력

  • 수정 완료
profile
널리 이롭게

0개의 댓글