https://wikidocs.net/book/4223
간단하게 핵심 내용이라고 생각한 부분만을 작성했다.
<1-03> 가상환경 만들기 → C:\venvs> python -m venv {가상환경 이름}
<1-04> 쉽게 가상환경 이동하기 → “mysite.cmd” 생성
<1-05> 장고 프로젝트 만들기(mysite) C:\projects{이름}>django-admin startproject config .
<1-05> 인터프리터 가상환경 위치로 변경
서버실행 → (mysite) C:\projects\mysite>python manage.py runserver
setting.py 에 언어설정, 시간설치 (시크릿 키 확인)
프로젝트 생성시 기본파일
앱생성 → (mysite) C:\projects\mysite>django-admin startapp {앱이름}
이건 http://localhost:8000/{앱이름} 요청시 응답
- 앱 생성시 기본 파일
- admin.py: Django 관리자 사이트와 관련된 설정을 정의하는 파일.
- apps.py: 앱의 설정을 정의하는 파일.
- models.py: 데이터베이스 모델을 정의하는 파일.
- tests.py: 테스트 케이스를 작성하는 파일.
- views.py: 뷰를 정의하는 파일.
- migrations/: 데이터베이스 마이그레이션 파일을 저장하는 디렉토리.
- 기타 초기화 파일(__init__.py 등).
프로젝트의 urls.py → URL과 앱의 뷰 함수간의 매핑 정의
페이지 요청시 가장 먼저 호출
즉, 1. URL 요청(웹 → 서버) / 2. urls.py 매핑확인 / 3. 매칭함수 결과(서버 → 웹)
**[urls.py]
from {앱} import views
urlpatterns = [
path('{앱}/', views.{함수}),
]
----------------------------------
[views.py]
from django.http import HttpResponse
def index(request):
return HttpResponse("ㅎㅇ.")
[프로젝트의 urls.py]
from django.urls import path, include
urlpatterns = [
path('{앱}/', include('{앱}.urls')),
]
------------------------------------------
[앱의 urls.py]
from django.urls import path
from . import views
urlpatterns = [
path('', views.{함수}),
]
C:\projects\mysite SQLite는 소규모 프로젝트에서 사용되는 가벼운 파일 기반의 데베DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
데이터베이스가 필요한 앱만 migrate가 필요하다.
INSTALLED_APPS = [
'pybo.apps.PyboConfig',
from pybo.models import Question, Answer - 모델 가져오기
from django.utils import timezone - 시간 라이브러리? 가져오기
테이블 데이터(튜플) 생성
q = Question(subject='~~', content='~', create_date=timezone.now())
생성된 데이터 저장
q.save()
q.id - 값 조회
Question.objects.all() - 데이터 조회
Question.objects.filter(id=1) subject__contains='장고’ 등등 조건 확인
• https://docs.djangoproject.com/en/4.0/topics/db/queries/
모델에 특정 애트리뷰트 값을 데이터 조회 시 보이도록
def str(self):
return self.subject
모델 수정 / 삭제
q = Question.objects.get(id=2) - 변수에 저장
q.subject = 'Django Model Question’
q.save()
q.delete()
외래키 존재 시 연결 객체 이용
a = Answer(question=q, content='~', create_date=timezone.now())
연결 테이블 찾으려면
q.answer_set.all()
a.question
from django.shortcuts import render, get_object_or_404
from .models import Question
def index(request):
question_list = Question.objects.order_by('-create_date') // - 는 역순
context = {'question_list' : question_list}
return render(request, 'pybo/question_list.html', context)
urlpatterns = [
path('', views.index, name = 'index'), -> 별칭은 view, 템플릿에서 사용
path('<int:question_id>/', views.detail),
]
프로젝트의 urls.py
path('pybo/', include('pybo.urls', namespace='pybo')),
앱의 urls.py
app_name = 'pybo’
사용예시
<li><a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a></li>
def answer_create(request, question_id):
question = get_object_or_404(Question, pk=question_id)
question.answer_set.create(content=request.POST.get('content'), create_date=timezone.now())
return redirect('pybo:detail', question_id=question.id)
request.POST.get('content') 이부분을 잘보면
템플릿의 post 타입 폼 답변 중 content 라는 데이터 값을 가져오는 것이다.
폼(Form) 이란?
앱에 form.py 파일을 따로 만들어줘야 한다.
모델을 import하고 Meta로 필드지정
from django import forms
from pybo.models import Question
class QuestionForm(forms.ModelForm):
class Meta:
model = Question # 사용할 모델
fields = ['subject', 'content']
from .forms import QuestionForm
def question_create(request):
form = QuestionForm()
return render(request, 'pybo/question_form.html', {'form': form})
def question_create(request):
if request.method == 'POST':
form = QuestionForm(request.POST)
if form.is_valid():
question = form.save(commit=False)
question.create_date = timezone.now()
question.save()
return redirect('pybo:index')
else:
form = QuestionForm()
context = {'form': form}
return render(request, 'pybo/question_form.html', context)
is_valid : form의 값이 유효한지 검사
commit = False : 임시저장, 즉 DB에 저장X → form에는 전체 속성이 있는 것이 아니기 때
Form의 위젯(부트스트랩 사용) / 레이블(속성 이름 설정) 도 있다.
필요할 때 코드를 찾아보기.