Django로 웹 프로젝트를 시작하고 구축하는 방법에 대해 알아봅니다.
pip install django
+) mac이면 manage.py 내부를 #!/usr/bin/env python3으로 변경해야 일일이 python3 명령어를 입
력하지 않아도 된다.
django-admin startproject tutorial
└── tutorial
├── manage.py
└── tutorial
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
cd tutorial
폴더 안으로 이동 후./manage.py startapp community
.
├── community
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── tutorial
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-313.pyc
│ └── settings.cpython-313.pyc
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'community', # 내가 생성한 커뮤니티 앱 추가
]
./manage.py migrate
: settings.py에서 설정한 경로로 데이터베이스 생성.: 프로젝트 생성 시 장고에서 제공. 데이터베이스를 관리할 수 있다.
./manage.py createsuperuser
→ 유저명 입력, 이메일 입력, 비밀번호 입력./manage.py runserver
→ 서버의 주소 뒤에 /admin으로 접근하면 어드민 페이지.# community/models.py
from django.db import models
class Article(models.Model):
name = models.CharField(max_length=50)
title = models.CharField(max_length=50)
contents = models.TextField()
url = models.URLField()
email = models.EmailField()
created_at = models.DateTimeField(auto_now_add=True) # 생성일자: 기본적으로 생성 시 자동
updated_at = models.DateTimeField(auto_now=True) # 수정일자: 기본적으로 수정 시 자동
./manage.py makemigrations community
: 커뮤니티 앱의 모델에 변화가 있는지 확인. 데이터베이스에 적용은 아직 안된 상태../manage.py migrate
: 데이터베이스에 적용. 테이블이 생성된다.: user들이 접근할 수 있는 주소 설정.
# urls.py
from django.contrib import admin
from django.urls import path
from community.views import write
urlpatterns = [
path('admin/', admin.site.urls),
path('write/', write, name='write'), # write/ 경로로 들어오면 write 함수를 호출
]
# community/view.py
from django.shortcuts import render
# urls.py에서 사용자의 요청이 들어오면, 실행되는 함수
def write(request): # request를 인자로 받는 write 함수
return render(request, 'write.html')
# request를 랜더링,
# 'write.html' 템플릿 지정 (write 함수가 'write.html'로 파일로 보냄)
<!-- /community/write.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Write</title>
</head>
<body>
<h1>Write</h1>
<p>hello world</p>
</body>
</html>
: 장고에서는 만들어진 모델을 이용해서 편리하게 폼을 만들수 있다.
# /community/forms.py
from django.forms import ModelForm
from community.models import Article
class Form(ModelForm):
class Meta:
model = Article # 정의된 Article 모델을 이용해서 쉽게 폼을 만들 수 있다.
fields = ['name', 'title', 'contents', 'url', 'email'] # 모델에 있는 필드명
# community/view.py
from django.shortcuts import render
from community.forms import Form
# urls.py에서 사용자의 요청이 들어오면, 실행되는 함수
def write(request):
form = Form() # 폼 생성
return render(request, 'write.html', {'form': form}) # 폼을 html에 전달
<!-- /community/write.html -->
<body>
<h1>Write</h1>
<form method="post">
{{ form.as_p }} <!-- p태그로 폼을 출력 -->
<!-- 다양한 방식으로 폼을 출력할 수 있다. -->
<!-- {{ form.as_table }} -->
<!-- {{ form.as_ul }} -->
{% csrf_token %} <!-- 폼 보안을 위해 추가, 토큰을 생성하고 전달하게끔, 없으면 오류 발생 -->
<button type="submit">Submit</button>
</form>
</body>
폼으로부터 데이터를 받아 데이터베이스에 저장
폼 버튼을 누르면 발생하는 게 post
# community/view.py
def write(request):
if request.method == 'POST': # POST 요청이 들어오면
form = Form(request.POST) # 폼 생성
if form.is_valid(): # 폼이 유효하면
form.save()
# 데이터베이스에 필드가 저장됨 (프레임워크로 인해 저장하는 과정이 이렇게 단순화 되었음!)
return redirect('list') # list 페이지로 리다이렉트
else: # POST 요청이 아니면
form = Form()
return render(request, 'write.html', {'form': form})
path('list/', get_list, name='list')
# community/view.py
def get_list(request):
# list 가져오기
articleList = Article.objects.all() # 데이터베이스에서 모든 Article 테이블의 모든 칼럼을 가져옴
return render(request, 'list.html', {'articleList': articleList}) # 데이터베이스 내용을 html에 전달
<!-- /community/templates/list.html -->
<body>
<h1>List</h1>
<ul>
<li>제목 | 저자 | 날짜</li>
{% for article in articleList %}
<!-- articleList를 받아서 articleList에 있는 필드 사용 -->
<li>{{ article.title }} | {{ article.name }} | {{ article.created_at | date:"Y-m-d H:i:s" }}</li>
{% endfor %}
</ul>
</body>
</html>
path('view/<int:num>/', view, name='view'), # 정수 num 경로 파라미터
# community/view.py
def view(request, num):
article = Article.objects.get(id=num) # 데이터베이스에서 id가 num인 Article 객체를 가져옴
return render(request, 'view.html', {'article': article})
<!-- /community/templates/view.html -->
<body>
<h1>View</h1>
<p>제목: {{ article.title }}</p>
<p>저자:{{ article.name }}</p>
<p>내용:{{ article.contents }}</p>
<p>URL:{{ article.url }}</p>
<p>Email:{{ article.email }}</p>
<p>생성일자:{{ article.created_at }}</p>
<p>수정일자:{{ article.updated_at }}</p>
</body>
<!-- /community/templates/list.html -->
<li>
<a href="/view/{{ article.id }}/">
{{ article.title }} | {{ article.name }} | {{ article.created_at | date:"Y-m-d H:i:s" }}
</a>
</li>