포렌키(Foreign Key)는
관계형 데이터베이스에서 두 테이블 간의 관계를 정의하는 데 사용되는 중요한 개념으로 포렌키를 사용하면 하나의 모델이 다른 모델과 관계를 맺을 수 있습니다.
한 테이블의 필드가 다른 테이블의 기본 키를 참조하도록 설정된 관계
두 테이블 간의 연관성을 설정
<장고기초 TEST 오답노트 >
Django 프로젝트에서 다양한 관리 명령을 실행할 수 있게 하는 파일은 무엇인가요?
...... 어이없어......매니지가 안보였다.........
실행 실행!!!!!!! 실행할때마다 manage.py 죽어라 했건만...
Django ORM이란 무엇이며, 왜 사용하는지 설명하세요.
나의 답:objects라는 매니저를 써서 데이터베이스에 접근 용이
보충이 필요한거같다.
모범답안
Django ORM(Object-Relational Mapping)**은 <Python 객체를 데이터베이스의 테이블과 매핑>하여 데이터베이스 조작을 간단하고 직관적으로 수행할 수 있게 해주는 도구입니다. <SQL 쿼리를 작성하지 않고도 Python 코드만으로 데이터베이스와 상호 작용할 수 있게 해줍니다.> 이를 통해 데이터베이스 독립성을 유지할 수 있으며, 데이터베이스 작업을 더 안전하고 효율적으로 수행할 수 있습니다.
orm은 파이썬으로 데베를 조작할수 있다.클래스로 데이터베이스 칼럼(열)을 생성.
나의 답: 커스텀하기 위해서 1:n m:n 개념을 사용하기 위해서?
모범답안
Django의 기본 User 모델을 사용하는 대신 Custom UserModel을 사용하면, 사용자 모델을 확장하거나 수정할 수 있어 프로젝트의 요구사항에 맞게 사용자 정보를 관리할 수 있습니다. 예를 들어, 추가적인 사용자 필드가 필요하거나 로그인 방식(예: 이메일로 로그인)을 변경하고 싶을 때 유용합니다. Custom UserModel을 사용하면 향후 확장성도 더 좋아지고, 프로젝트 시작 시 이러한 커스터마이징을 도입하면 나중에 구조 변경이 필요할 때 발생할 수 있는 문제를 예방할 수 있습니다.
나의 답: 팔로우와 좋아요 기능
모범답안
Django의 ManyToMany는 두 모델간의 다대다 관계를 정의할 때 사용됩니다. <다대다 관계란 한 모델의 여러 인스턴스가 다른 모델의 여러 인스턴스와 연결될 수 있는 경우를 말합니다.> 예를 들어, 하나의 학생이 여러 과목을 수강할 수 있고, 동시에 하나의 과목을 여러 학생이 수강할 수 있는 상황이 있을 수 있습니다.
Django는 이러한 관계를 처리하기 위해 자동으로 <중간 테이블을 생성>하며 이 테이블에는 두 모델의 <외래 키>가 저장되어 있습니다.
title
), 내용(content
), 작성일(created_at
), 수정일(updated_at
) 필드를 추가하세요.CharField
), 내용은 텍스트(TextField
), 작성일과 수정일은 날짜/시간(DateTimeField
) 필드로 정의합니다.created_at
과 updated_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
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 객체를 전달합니다.
이 객체는 삭제할 포스트의 세부 정보(예: 제목)를 포함하고 있어,
사용자에게 "정말 이 포스트를 삭제하시겠습니까?"와 같은 확인 메시지를 표시할 수 있습니다.>