def todo_list(request): # 함수형
todos = Todo.objects.all()
return render(request, "todo/todo.html", {"todos": todos})
코드 해석 하나씩 자세하게 알려줘
def todo_list(request):
def : 함수를 정의하는 키워드todo_list : 함수 이름 (URL 요청이 들어오면 이 함수가 실행됨)request : 사용자가 보낸 HTTP 요청 정보가 담긴 객체 (누가 요청했는지, GET/POST인지 등) todos = Todo.objects.all()
Todo : 데이터베이스 테이블과 연결된 Django 모델 (클래스).objects : 데이터베이스에 접근할 수 있게 해주는 매니저(Manager).all() : 테이블에 있는 모든 행(row) 을 가져오는 쿼리 → SQL의 SELECT * FROM todo 와 동일todos : 가져온 데이터 목록을 담는 변수 return render(request, "todo/todo.html", {"todos": todos})
render() : 템플릿(HTML)과 데이터를 합쳐서 최종 HTML을 만들어 반환하는 함수request : 첫 번째 인자, 현재 요청 객체를 그대로 전달"todo/todo.html" : 두 번째 인자, 렌더링할 HTML 템플릿 파일 경로{"todos": todos} : 세 번째 인자 (context), 템플릿에 넘길 데이터"todos" 는 HTML 템플릿 안에서 사용할 변수 이름todos 는 위에서 DB에서 가져온 실제 데이터사용자가 URL 접속
→ todo_list(request) 실행
→ DB에서 전체 Todo 목록 조회
→ todo.html 템플릿에 데이터 전달
→ 완성된 HTML을 사용자 브라우저에 응답
질문
return render(request, "todo/todo.html", {"todos": todos})
여기에서 딕션너리 변수 값 이라는데 이것말고도 다른 내용들도 알려줘
render()의 세 번째 인자 (Context) 심화{"todos": todos}
# key : 템플릿에서 사용할 이름
# value : 실제 전달할 데이터
return render(request, "todo/todo.html", {
"todos": todos,
"username": "홍길동",
"count": 5,
})
딕셔너리니까 여러 쌍을 , 로 추가 가능
{
"todos" : todos, # QuerySet (DB 데이터 목록)
"username": "홍길동", # 문자열
"count" : 42, # 숫자
"is_login": True, # 불리언
"tags" : ["공부","운동"], # 리스트
"user" : request.user, # 객체
}
<!-- 문자열 -->
<p>{{ username }}</p>
<!-- 숫자 -->
<p>할 일 개수: {{ count }}</p>
<!-- 불리언 -->
{% if is_login %}
<p>로그인 됨</p>
{% endif %}
<!-- 리스트 반복 -->
{% for tag in tags %}
<span>{{ tag }}</span>
{% endfor %}
<!-- QuerySet 반복 -->
{% for todo in todos %}
<p>{{ todo.title }}</p>
{% endfor %}
→ 딕셔너리의 key 이름 을 그대로 {{ }} 안에 써서 사용
def todo_list(request):
todos = Todo.objects.all()
context = { # 딕셔너리를 변수로 먼저 만들고
"todos": todos,
"count": todos.count(),
}
return render(request, "todo/todo.html", context) # 변수로 전달
→ 데이터가 많을 때 가독성을 높이기 위해 자주 쓰는 패턴
return render(request, "todo/todo.html")
# 세 번째 인자 생략 가능 → 템플릿에 데이터 없이 HTML만 렌더링
| 구분 | 설명 |
|---|---|
| 위치 | render()의 세 번째 인자 |
| 타입 | 딕셔너리 {} |
| key | 템플릿에서 쓸 변수 이름 (문자열) |
| value | 실제 전달할 데이터 (뭐든 가능) |
| 생략 | 가능 (데이터 없이 HTML만 반환) |
네, 맞아요! 지금 배운 흐름이 CRUD의 기초 뼈대예요.
| 약자 | 의미 | HTTP 방식 | 하는 일 |
|---|---|---|---|
| Create | 생성 | POST | 새 데이터 추가 |
| Read | 조회 | GET | 데이터 읽기 |
| Update | 수정 | POST/PUT | 데이터 변경 |
| Delete | 삭제 | POST/DELETE | 데이터 제거 |
def todo_list(request):
todos = Todo.objects.all()
return render(request, "todo/todo.html", {"todos": todos})
→ 이게 바로 R (Read) 조회 입니다
# C - Create (생성)
def todo_create(request):
if request.method == "POST":
title = request.POST["title"] # 사용자 입력 받기
Todo.objects.create(title=title) # DB에 저장
return redirect("todo_list") # 목록으로 이동
# R - Read (조회) ← 지금 배운 것
def todo_list(request):
todos = Todo.objects.all()
return render(request, "todo/todo.html", {"todos": todos})
# U - Update (수정)
def todo_update(request, pk):
todo = Todo.objects.get(pk=pk) # 특정 데이터 찾기
todo.title = request.POST["title"]
todo.save() # DB에 저장
return redirect("todo_list")
# D - Delete (삭제)
def todo_delete(request, pk):
todo = Todo.objects.get(pk=pk) # 특정 데이터 찾기
todo.delete() # DB에서 삭제
return redirect("todo_list")
✅ request가 뭔지 → 지금 배움
✅ render()이 뭔지 → 지금 배움
✅ context(딕셔너리) 전달 → 지금 배움
⬜ request.method → POST/GET 구분 (Create에 필요)
⬜ redirect() → 다른 페이지로 이동
⬜ pk (primary key) → 특정 데이터 하나 찾기 (Update/Delete에 필요)
⬜ URL 연결 (urls.py) → 함수와 URL 매핑
지금 배운 것 = CRUD의 R 이고, 나머지 C·U·D도 같은 구조에서
.create().save().delete()만 바뀌는 거라 흐름을 이해하면 충분히 만들 수 있어요 💪