장심주 9월시작... 장고기초 TEST 오답노트

김나현·2024년 9월 2일
1
post-thumbnail

포렌키(Foreign Key)는
관계형 데이터베이스에서 두 테이블 간의 관계를 정의하는 데 사용되는 중요한 개념으로 포렌키를 사용하면 하나의 모델이 다른 모델과 관계를 맺을 수 있습니다.

한 테이블의 필드가 다른 테이블의 기본 키를 참조하도록 설정된 관계
두 테이블 간의 연관성을 설정

<장고기초 TEST 오답노트 >

  1. Django 프로젝트에서 다양한 관리 명령을 실행할 수 있게 하는 파일은 무엇인가요?

    • A) settings.py
    • B) urls.py
    • C) views.py
    • D) manage.py

    ...... 어이없어......매니지가 안보였다.........
    실행 실행!!!!!!! 실행할때마다 manage.py 죽어라 했건만...

  2. Django ORM이란 무엇이며, 왜 사용하는지 설명하세요.

나의 답:objects라는 매니저를 써서 데이터베이스에 접근 용이

보충이 필요한거같다.

모범답안
Django ORM(Object-Relational Mapping)**은 <Python 객체를 데이터베이스의 테이블과 매핑>하여 데이터베이스 조작을 간단하고 직관적으로 수행할 수 있게 해주는 도구입니다. <SQL 쿼리를 작성하지 않고도 Python 코드만으로 데이터베이스와 상호 작용할 수 있게 해줍니다.> 이를 통해 데이터베이스 독립성을 유지할 수 있으며, 데이터베이스 작업을 더 안전하고 효율적으로 수행할 수 있습니다.
orm은 파이썬으로 데베를 조작할수 있다.클래스로 데이터베이스 칼럼(열)을 생성.

  1. Django의 Custom UserModel을 사용하는 이유와 장점을 설명하세요.

나의 답: 커스텀하기 위해서 1:n m:n 개념을 사용하기 위해서?

모범답안
Django의 기본 User 모델을 사용하는 대신 Custom UserModel을 사용하면, 사용자 모델을 확장하거나 수정할 수 있어 프로젝트의 요구사항에 맞게 사용자 정보를 관리할 수 있습니다. 예를 들어, 추가적인 사용자 필드가 필요하거나 로그인 방식(예: 이메일로 로그인)을 변경하고 싶을 때 유용합니다. Custom UserModel을 사용하면 향후 확장성도 더 좋아지고, 프로젝트 시작 시 이러한 커스터마이징을 도입하면 나중에 구조 변경이 필요할 때 발생할 수 있는 문제를 예방할 수 있습니다.

  1. Django에서 Model 클래스는 데이터베이스 테이블과 매핑됩니다. Django ORM에서 모델을 정의할 때 필드를 정의할 수 있는 다양한 옵션 중 ManyToManyField에 대해 구체적인 사용 사례를 들어 설명하세요.

나의 답: 팔로우와 좋아요 기능

모범답안
Django의 ManyToMany는 두 모델간의 다대다 관계를 정의할 때 사용됩니다. <다대다 관계란 한 모델의 여러 인스턴스가 다른 모델의 여러 인스턴스와 연결될 수 있는 경우를 말합니다.> 예를 들어, 하나의 학생이 여러 과목을 수강할 수 있고, 동시에 하나의 과목을 여러 학생이 수강할 수 있는 상황이 있을 수 있습니다.
Django는 이러한 관계를 처리하기 위해 자동으로 <중간 테이블을 생성>하며 이 테이블에는 두 모델의 <외래 키>가 저장되어 있습니다.

  1. Django 모델을 작성하세요. "BlogPost"라는 이름의 모델을 만들고, 제목(title), 내용(content), 작성일(created_at), 수정일(updated_at) 필드를 추가하세요.
    • 제목은 문자열(CharField), 내용은 텍스트(TextField), 작성일과 수정일은 날짜/시간(DateTimeField) 필드로 정의합니다.
    • created_atupdated_at 필드는 각각 자동으로 생성되도록 설정하세요.

나의 답:

class BlogPost(models.Model):
          title = CharField(max length=200)
          content = TextField
          created_at = DateTimeField(auto_now=True)
          updated_at = DateTimeField(auto_now_add=True)

일단 임포트 안함.
max_length에서 언더바 안씀.
칼럼에서 models. 를 다 빼먹음.
<Django에서 모델을 정의할 때, 모든 모델 클래스는 models.Model을 상속받습니다. 이는 해당 클래스가 Django ORM에서 인식되는 데이터베이스 모델임을 의미합니다.
models.Model을 상속받는 클래스를 정의하면, 그 클래스는 데이터베이스 테이블로 변환되고, Django를 통해 데이터베이스와 상호작용할 수 있습니다.
add 위치 바뀜.
수정하는 업데이트가 항상 나우로 해야한다.

def __str__(self):
        return self.title

객체의 문자열 표현을 반환하는 데 사용
self는 현재 인스턴스를 가리킵니다.
<self.title은 이 인스턴스의 title 필드(속성)에 저장된 값을 의미합니다.>

정답

from django.db import models
<Django의 데이터베이스 모델을 사용하기 위해 필요한 모듈을 불러옵니다.>

class BlogPost(models.Model):
<BlogPost라는 클래스를 정의합니다.  클래스는 Django의 models.Model을 
상속받아 데이터베이스 테이블의 구조를 만듭니다.>
    title = models.CharField(max_length=200)
    <title 필드는 블로그 포스트의 제목을 저장> 필드==열==칼럼
    <CharField는 문자열을 저장하는 필드로, 최대 길이가 200자로 제한>
    content = models.TextField()
    <content 필드는 블로그 포스트의 내용을 저장>
    <TextField는  텍스트를 저장할  있는 필드입니다. CharField보다 
    훨씬  텍스트를 저장할  있습니다.>
    created_at = 
    <블로그 포스트가 처음 생성된 날짜와 시간을 저장>
    models.DateTimeField(auto_now_add=True)
    updated_at =
    <블로그 포스트가 수정된 날짜와 시간을 저장>
    models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title
  1. 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')

나의 답

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        
        form.is_valid()
        return redirect('home/')
else:
        context = {
                            "fail" : "로그인 실패"
                          }
       return render(request, 'login.html', context) 

"우린 이런걸 '가관'이라고 부르기로 했어요."
누가 설명해 줄사람....

정답
코드 해설 들어갑니다>>>>>>>>>>

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
       #요청의 메서드 확인 -
       사용자가 로그인 폼을 제출했는지 확인합니다. 
       로그인 폼이 제출되면 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')
    #사용자가 로그인 페이지를 처음 열었을 때, 
    로그인 폼을 포함한 login.html 템플릿을 렌더링하여 보여줍니다.
    <폼이 처음 요청될  처리>




Post에 대해 CRUD를 하는 코드의 일부

Read

def post_list(request):
<포스트 목록을 보여주는  함수>
    posts = Post.objects.all()
    <Post라는 모델에서 모든 블로그 포스트를 
    데이터베이스에서 가져와 posts라는 변수에 저장>
    <Post 모델의 모든 객체(블로그 포스트)를 가져오는 
    쿼리셋(queryset)을 생성합니다. 
    즉, 데이터베이스에 저장된 모든 블로그 포스트를 가져옵니다.>
    return render(request, 'posts/index.html', {'posts': posts})
	<가져온 블로그 포스트 목록을 
	index.html이라는 템플릿에 전달하여  페이지를 생성하고,
	 페이지를 사용자에게 보여줍니다.>
    <posts/index.html 템플릿 파일에 posts 데이터를 전달합니	다. 
    이 템플릿은 HTML 파일로, 전달된 posts 데이터를 사용해 
    화면에 블로그 포스트 목록을 보여줍니다.
	{'posts': posts}: 
	사전(dict) 형태로 데이터를 전달합니다. 
	이 경우 posts라는 이름으로 템플릿에 데이터가 전달되며,
    템플릿에서 이 데이터를 사용할 수 있게 됩니다.>
    
    
    Create
    
    def post_create(request):
    <사용자가 새로운 블로그 포스트를 만들고 저장하기 위한 뷰(view)입니다. request 객체는 사용자의 요청에 대한 정보를 담고 있습니다.>
    if request.method == 'POST':
    <사용자가 폼을 제출했는지(즉, POST 요청인지) 확인합니다. 
    POST 요청은 사용자가 데이터를 서버로 보낼  사용>
        form = PostForm(request.POST)
        <PostForm이라는  객체form를 생성합니다. 
        request.POST는 사용자가 제출한 데이터(예: 제목, 내용 등)를 포함>
        if form.is_valid():
        <조건문은 폼이 유효한지 확인합니다. 
        즉, 사용자가 올바른 데이터
        (예: 비어 있지 않은 제목, 적절한 길이의 내용)를 입력했는지 검사>
            form.save()
            <폼이 유효하다면,  데이터를 데이터베이스에 저장합니다.
            새로운 블로그 포스트가 데이터베이스에 추가>
            return redirect('post_list')
            <데이터가 성공적으로 저장되면, 블로그 포스트 목록 페이지로 리디렉션합니다. 
            사용자는 이제 자신이 작성한 포스트가 포함된 목록을 보게 됩니다.>
    else:
        form = PostForm()
        <사용자가 폼을 제출한 것이 아니고, 처음으로 폼을 요청한 경우(즉, GET 요청)에는  부분이 실행>
    return render(request, 'posts/form.html', {'form': form})
 {'form': form}: form 객체를 템플릿에 전달합니다. 템플릿에서는 이 폼 객체를 사용하여 HTML 폼을 생성하고, 사용자가 데이터를 입력할 수 있게 합니다.
    
    
    
    
  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':
    <사용자가 폼을 제출한 경우(즉, POST 요청)  부분이 실행됩니다.>
        form = PostForm(request.POST, instance=post)
        <사용자가 제출한 데이터를 PostForm에 전달합니다. 
        form객체 생성>
        if form.is_valid():
            form.save()
            return redirect('post_list')
            <저장이 완료되면 사용자를 
            블로그 포스트 목록 페이지로 리디렉션합니다.>
    else:
        form = PostForm(instance=post)
        <POST 요청이 아닌 경우(즉, 사용자가 폼을 처음 열었을 때) 
         부분이 실행>
    return render(request, 'posts/form.html', {'form': form})
    <기존의 블로그 포스트 데이터를 담은 PostForm을 생성하여 
    사용자에게 보여줍니다. 
     폼에는 이미 기존의 포스트 데이터가 채워져 있어, 
    사용자는 이를 수정할  있습니다.>

Delete

def post_delete(request, post_id):
    post = get_object_or_404(Post, pk=post_id) # 모두 정답
    <해당 객체가 존재하지 않으면 404 오류 페이지를 반환>
    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 요청),  부분이 실행>
        post.delete()
        return redirect('post_list')
        <삭제 작업이 완료된 후, 사용자를 블로그 포스트 목록 페이지로 리디렉션합니다. 
         페이지에서 삭제된 포스트가  이상 표시되지 않습니다.>
    return render(request, 'posts/confirm_delete.html', {'post': post})
    <POST 요청이 아닌 경우, 
     사용자가 처음으로 삭제 페이지를  때는  부분이 실행됩니다.>
    <{'post': post}: 템플릿에 post 객체를 전달합니다. 
     객체는 삭제할 포스트의 세부 정보(예: 제목)를 포함하고 있어, 
    사용자에게 "정말  포스트를 삭제하시겠습니까?"와 같은 확인 메시지를 표시할  있습니다.>
    
profile
참 쉽죠? #개발계의 밥아저씨를 꿈꿉니다⋆⁺₊⋆ ☾⋆⁺₊⋆

0개의 댓글