Django 실습

배추·2025년 9월 7일
0

🥷 Django

목록 보기
3/6

Django로 웹 프로젝트를 시작하고 구축하는 방법에 대해 알아봅니다.


▶︎장고 설치

  • pip install django

▶︎프로젝트 & app 생성

+) 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에 생성한 앱을 등록.
# 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에서 설정한 경로로 데이터베이스 생성.
    • db.sqllite3 파일이 생성된다.
    • 데이터베이스에 자동으로 장고가 필요한 기본적인 데이터베이스 테이블들이 생성된다.

▶︎관리자 페이지

: 프로젝트 생성 시 장고에서 제공. 데이터베이스를 관리할 수 있다.

  • 슈펴유저 생성: ./manage.py createsuperuser → 유저명 입력, 이메일 입력, 비밀번호 입력
  • 웹서버 실행: ./manage.py runserver → 서버의 주소 뒤에 /admin으로 접근하면 어드민 페이지.

▶︎앱의 모델 생성

  • app을 만든 후 models.py에서 모델을 정의.
    • 모델은 class로 생성된다. (class는 모델을 상속하게 된다.)
# 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: 데이터베이스에 적용. 테이블이 생성된다.

▶︎urls.py에서 url 설정

: 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 함수를 호출
]

▶︎view.py에서 함수 정의

  • 정의된 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에 templates 폴더 생성 후 그 안에 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>
  • 서버를 실행해서 /write로 가면 write.html을 볼 수 있다.

▶︎forms.py

: 장고에서는 만들어진 모델을 이용해서 편리하게 폼을 만들수 있다.

  • forms.py: 폼 정의.
# /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'] # 모델에 있는 필드명
  • view.py: 폼 생성 후 write.html 템플릿에 폼데이터 전달.
# 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에 전달
  • write.html: 폼 태그 지정하여 사용.
    • {{ form.as_p }}
    • {{ form.as_table }}
    • {{ form.as_ul }}
<!-- /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 글쓰기

폼으로부터 데이터를 받아 데이터베이스에 저장
폼 버튼을 누르면 발생하는 게 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})

▶︎GET 글 리스트

  • urls.py에 url 추가.
 path('list/', get_list, name='list')
  • view.py에 get_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 파일 생성.
<!-- /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>



▶︎GET 해당 글 보기

  • urls.py에 url 추가.
path('view/<int:num>/', view, name='view'), # 정수 num 경로 파라미터
  • view.py에 view 함수 정의.
# 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 파일 생성.
<!-- /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>
  • list.html에서 링크로 만들기.
<!-- /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>

profile
난 🥬

0개의 댓글