-
Python Django 기초 시험 오답노트Django 2024. 9. 2. 14:41
파이썬 장고 기초 시험을 봤다. 주관식 및 코드작성 문제에서.. 오답이 좀 있었다..🫨
객관식(7)
- Django 프로젝트에서 다양한 관리 명령을 실행할 수 있게 하는 파일은 무엇인가요?
- A) settings.py
- B) urls.py
- C) views.py
- D) manage.py
- 다음 중 Django에서 제공하는 기본적인 데이터베이스는 무엇인가요?
- A) PostgreSQL
- B) MySQL
- C) SQLite
- D) MongoDB
- Django의 QuerySet 메서드 중 데이터베이스에서 특정 조건에 맞는 모든 레코드를 반환하는 메서드는 무엇인가요?
- A) filter()
- B) get()
- C) exclude()
- D) all()
- Django 템플릿 시스템에서 변수의 값을 출력할 때 사용하는 문법은 무엇인가요?
- A) {{ 변수 }}
- B) { 변수 }
- C) {% 변수 %}
- D) [[ 변수 ]]
- 웹 어플리케이션에서 쿠키(Cookie)의 주요 목적은 무엇인가요?
- A) 사용자의 세션 데이터를 서버에 저장하기 위해
- B) 사용자의 브라우저에 데이터를 저장하여 다음 방문시 사용하기 위해
- C) 데이터베이스 쿼리를 최적화 하기 위해
- D) 사용자의 암호를 안전하게 저장하기 위해
- Django에서 특정URL에 대한 요청을 처리할 뷰(View)와 연결할 때 주로 사용하는 함수는 무엇인가요?
- A) path()
- B) url()
- C) include()
- D) route()
- 다음 중 Django의 ModelForm을 사용하는 이유로 가장 적절한 것은 무엇인가요?
- A) 폼을 통해 입력된 데이터를 데이터베이스에 자동으로 저장하기 위해
- B) 유저로부터 입력된 데이터를 검증하지 않고 직접 처리하기 위해
- C) Django의 인증시스템을 우회하기 위해
- D) HTML 템플릿에서 직접 쿼리셋을 사용하기 위해
다행히 객관식은 통과
주관식(5)
8. Django의 MTV 패턴에서 각 요소(Model, Template, View)의 역할을 간단히 설명하세요.
내가 작성한 답:
- Model: 데이터베이스 관련 로직 처리
- Template: 화면에 보여지는 html, UI 정의
- View: 실행, 계산, 요청 처리, 응답 생성 등 비즈니스 로직 처리모법답안
∙ Model: 데이터베이스 구조를 정의하고, 데이터를 관리하는 역할을 합니다. 데이터베이스 테이블과 매핑되며, 데이터를 저장, 조회, 수정, 삭제하는 기능을 제공합니다.
∙ Template: 사용자에게 보여지는 화면을 담당합니다. HTML 파일과 같은 템플릿을 통해 데이터를 시각적으로 표현하며, 동적인 웹 페이지를 생성하는 데 사용됩니다.
∙ View: 사용자의 요청을 처리하고, 적절한 데이터를 가져와서 템플릿과 결합하여 응답을 생성하는 역할을 합니다. View는 Model과 Template 사이에서 중개자 역할을 합니다.9. Django에서 settings.py 파일의 주요 역할을 구체적인 예시를 들어 설명하세요.
내가 작성한 답:
settings.py는 장고 프레임워크의 프로젝트 환경을 설정하는 파일이다. 예를 들어 우리가 앱을 생성하면 앱을 등록해야 하는데 이때 settings.py파일 안의 INSTALLED_APP에 새로 만든 앱을 추가줘야 한다.모법답안
settings.py 파일은 Django 프로젝트의 설정을 관리하는 파일입니다. 데이터베이스 설정, 설치된 앱, 미들웨어, 정적 파일 경로, 템플릿 설정, 국제화 설정, 보안 키 등의 다양한 프로젝트 설정이 이 파일에 포함됩니다. 프로젝트 전반의 동작을 조정하고, 필요한 외부 리소스나 라이브러리를 연결하는 역할을 합니다.
10. Django ORM이란 무엇이며, 왜 사용하는지 설명하세요.
내가 작성한 답:
장고 ORM은 Object에 관계형 데이터베이스를 맵핑해준다는 뜻으로, SQL 쿼리문 없이 파이썬 코드만으로 데이터베이스를 조작할 수 있게 해주는 편리한 아이라서 사용한다.모범답안
Django ORM(Object-Relational Mapping)은 Python 객체를 데이터베이스의 테이블과 매핑하여 데이터베이스 조작을 간단하고 직관적으로 수행할 수 있게 해주는 도구입니다. SQL 쿼리를 작성하지 않고도 Python 코드만으로 데이터베이스와 상호 작용할 수 있게 해줍니다. 이를 통해 데이터베이스 독립성을 유지할 수 있으며, 데이터베이스 작업을 더 안전하고 효율적으로 수행할 수 있습니다.
11. Django의 Custom UserModel을 사용하는 이유와 장점을 설명하세요.
내가 작성한 답:
개발할 때 user model에 내장되어 있는 필드들이 필요하지 않을 수도 있고, 또 내장되어 있지 않지만 필요한 필드가 존재하기도 한다. 그렇기 때문에 user model을 프로젝트에 맞게 커스텀할 수 있는 Custom User Model을 사용한다. Custom User Model을 사용하면 편리하고 빠르게 유저 모델을 세팅할 수 있고, 추후 필요할 때마다 손쉽게 모델을 수정하거나 추가할 수 있다는 장점이 있다.모법답안
Django의 기본 User 모델을 사용하는 대신 Custom UserModel을 사용하면, 사용자 모델을 확장하거나 수정할 수 있어 프로젝트의 요구사항에 맞게 사용자 정보를 관리할 수 있습니다. 예를 들어, 추가적인 사용자 필드가 필요하거나 로그인 방식(예: 이메일로 로그인)을 변경하고 싶을 때 유용합니다. Custom UserModel을 사용하면 향후 확장성도 더 좋아지고, 프로젝트 시작 시 이러한 커스터마이징을 도입하면 나중에 구조 변경이 필요할 때 발생할 수 있는 문제를 예방할 수 있습니다.
12. Django에서 Model 클래스는 데이터베이스 테이블과 매핑됩니다. Django ORM에서 모델을 정의할 때 필드를 정의할 수 있는 다양한 옵션 중 ManyToManyField에 대해 구체적인 사용 사례를 들어 설명하세요.
내가 작성한 답:
class Icecream(models.Model): name = models.CharField(max_length=10) toppings = models.ManyToManyField('Topping') class Topping(models.Model): name = models.CharField(max_length=10)
아이스크림과 토핑 사이의 다대다 관계가 설정된다. 아이스크림은 여러가지 토핑과 연결되고 토핑도 여러가지 아이스크림과 연결될 수 있다.
모법답안
Django의 ManyToMany는 두 모델간의 다대다 관계를 정의할 때 사용됩니다. 다대다 관계란 한 모델의 여러 인스턴스가 다른 모델의 여러 인스턴스와 연결될 수 있는 경우를 말합니다. 예를 들어, 하나의 학생이 여러 과목을 수강할 수 있고, 동시에 하나의 과목을 여러 학생이 수강할 수 있는 상황이 있을 수 있습니다.
Django는 이러한 관계를 처리하기 위해 자동으로 중간 테이블을 생성하며 이 테이블에는 두 모델의 외래 키가 저장되어 있습니다.
코드작성 (3문제)
13. Django 모델을 작성하세요. "BlogPost"라는 이름의 모델을 만들고, 제목(title), 내용(content), 작성일(created_at), 수정일(updated_at) 필드를 추가하세요.
- 제목은 문자열(CharField), 내용은 텍스트(TextField), 작성일과 수정일은 날짜/시간(DateTimeField) 필드로 정의합니다.
- created_at과 updated_at 필드는 각각 자동으로 생성되도록 설정하세요.
내가 작성한 답 ⭕️
from django.db import models class BlogPost(models.Model): title = models.CharField(max_length=120) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True)
정답코드
from django.db import models class BlogPost(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.title
14. Django에서 사용자가 로그인할 수 있는 간단한 로그인 뷰를 작성하세요.
- 사용자가 로그인 폼을 제출했을 때, 해당 사용자를 인증하고, 성공적으로 로그인할 경우 'home' 페이지로 리디렉션합니다.
- 로그인 실패 시 다시 로그인 페이지로 리디렉션하며, 실패 메시지를 출력하세요.
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login def login_view(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] # 이곳에 코드를 작성해 주세요. return render(request, 'login.html')
내가 작성한 답 ⭕️
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.contrib import messages def login_view(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('home') else: messages.error(request, "잘못 입력하셨습니다. 다시 입력해 주세요:( ") return redirect('login') return render(request, 'login.html')
정답코드
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login def login_view(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('home') else: messages.error(request, 'Invalid username or password') return redirect('login') return render(request, 'login.html')
15. 다음의 Post에 대해 CRUD를 하는 코드의 일부입니다. 아래 내용을 참고하여 코드를 완성해 주세요.
Post 모델은 다음과 같은 필드를 가진다고 가정합니다.
- title: CharField(max_length=100)
- content: TextField()
- created_at: DateTimeField(auto_now_add=True)
15.1 Read
def post_list(request): posts = ( ) context = {'posts': posts} return render(request, 'posts/index.html', context)
내가 작성한 답 (Read) ❓ 암튼 맞긴 맞음🤔
def post_list(request): posts = Post.objects.all() context = {'posts': posts} return render(request, 'posts/index.html', context)
정답코드 Read
def post_list(request): posts = Post.objects.all() return render(request, 'posts/index.html', {'posts': posts})
15.2 Create
def post_create(request): if ( ): form = PostForm( ) if form.is_valid(): ( ) return redirect('post_list') else: form = PostForm() return render(request, 'posts/form.html')
내가 작성한 답 (Create) ⭕️
def post_create(request): if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): form.save() return redirect('post_list') else: form = PostForm() return render(request, 'posts/form.html')
근데 똑같이 복붙해서 쓴건데.. 들여쓰기가 왜 이모양일까..🤔
정답코드 Create
def post_create(request): if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): form.save() return redirect('post_list') else: form = PostForm() return render(request, 'posts/form.html', {'form': form})
15.3 Update
def post_update(request, post_id): post = ( ) if ( ): form = PostForm( ) if form.is_valid(): ( ) return redirect('post_list') else: form = PostForm( ) return render(request, 'posts/form.html', {'form': form})
내가 작성한 답 (Update) ⭕️
def post_update(request, post_id): post = get_object_or_404(Post, id=post_id) if request.method == "POST": form = PostForm(request.POST, instance=post) if form.is_valid(): form.save() return redirect('post_list') else: form = PostForm(instance=post) return render(request, 'posts/form.html', {'form': form})
정답코드 Update
def post_update(request, post_id): post = get_object_or_404(Post, pk=post_id) # 모두 정답 post = get_object_or_404(Post, id=post_id) # 모두 정답 post = Post.objects.get(pk=post_id) # 모두 정답 post = Post.objects.get(id=post_id) # 모두 정답 if request.method == 'POST': form = PostForm(request.POST, instance=post) if form.is_valid(): form.save() return redirect('post_list') else: form = PostForm(instance=post) return render(request, 'posts/form.html', {'form': form})
15.4 Delete
def post_delete(request, post_id): post = ( ) if ( ): ( ) return redirect('post_list') return render(request, 'posts/confirm_delete.html', {'post': post})
내가 작성한 답 Delete ❌
def post_delete(request, post_id): post = get_object_or_404(Post, id=post_id) if request.method == "POST": form.delete() return redirect('post_list') return render(request, 'posts/confirm_delete.html', {'post': post})
아 post.delete() 🫠 form이 없구나....
정답코드 Delete
def post_delete(request, post_id): post = get_object_or_404(Post, pk=post_id) # 모두 정답 post = get_object_or_404(Post, id=post_id) # 모두 정답 post = Post.objects.get(pk=post_id) # 모두 정답 post = Post.objects.get(id=post_id) # 모두 정답 if request.method == 'POST': post.delete() return redirect('post_list') return render(request, 'posts/confirm_delete.html', {'post': post})
'Django' 카테고리의 다른 글
Django 외부 API 연동하기 (1) 2024.09.05 Token Auth with JWT (1) 2024.09.03 Django REST Framework, Postman (3) 2024.09.01 JSON Response와 Serialization (1) 2024.09.01 HTTP와 URL구조 (1) 2024.08.29 - Django 프로젝트에서 다양한 관리 명령을 실행할 수 있게 하는 파일은 무엇인가요?