ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python Django 기초 시험 오답노트
    Django 2024. 9. 2. 14:41

     

    파이썬 장고 기초 시험을 봤다. 주관식 및 코드작성 문제에서.. 오답이 좀 있었다..🫨

     

     

     

    객관식(7) 

    1. Django 프로젝트에서 다양한 관리 명령을 실행할 수 있게 하는 파일은 무엇인가요?
    2. 다음 중 Django에서 제공하는 기본적인 데이터베이스는 무엇인가요?
      • A) PostgreSQL
      • B) MySQL
      • C) SQLite
      • D) MongoDB
    3. Django의 QuerySet 메서드 중 데이터베이스에서 특정 조건에 맞는 모든 레코드를 반환하는 메서드는 무엇인가요?
      • A) filter()
      • B) get()
      • C) exclude()
      • D) all()
    4. Django 템플릿 시스템에서 변수의 값을 출력할 때 사용하는 문법은 무엇인가요?
      • A) {{ 변수 }}
      • B) { 변수 }
      • C) {% 변수 %}
      • D) [[ 변수 ]]
    5. 웹 어플리케이션에서 쿠키(Cookie)의 주요 목적은 무엇인가요?
      • A) 사용자의 세션 데이터를 서버에 저장하기 위해
      • B) 사용자의 브라우저에 데이터를 저장하여 다음 방문시 사용하기 위해
      • C) 데이터베이스 쿼리를 최적화 하기 위해
      • D) 사용자의 암호를 안전하게 저장하기 위해
    6. Django에서 특정URL에 대한 요청을 처리할 뷰(View)와 연결할 때 주로 사용하는 함수는 무엇인가요?
      • A) path()
      • B) url()
      • C) include()
      • D) route()
    7. 다음 중 Django의 ModelForm을 사용하는 이유로 가장 적절한 것은 무엇인가요?
      • A) 폼을 통해 입력된 데이터를 데이터베이스에 자동으로 저장하기 위해
      • B) 유저로부터 입력된 데이터를 검증하지 않고 직접 처리하기 위해
      • C) Django의 인증시스템을 우회하기 위해
      • D) HTML 템플릿에서 직접 쿼리셋을 사용하기 위해

     

    다행히 객관식은 통과


     

    주관식(5)

     

    8. Django의 MTV 패턴에서 각 요소(Model, Template, View)의 역할을 간단히 설명하세요.

     

    내가 작성한 답: 
    - Model: 데이터베이스 관련 로직 처리
    - Template: 화면에 보여지는 html, UI 정의
    - View: 실행, 계산, 요청 처리, 응답 생성 등 비즈니스 로직 처리

     

     

    모법답안

    ∙ Model: 데이터베이스 구조를 정의하고, 데이터를 관리하는 역할을 합니다. 데이터베이스 테이블과 매핑되며, 데이터를 저장, 조회, 수정, 삭제하는 기능을 제공합니다.

    Templat
    e: 사용자에게 보여지는 화면을 담당합니다. 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
Designed by Tistory.