본문 바로가기

[내일배움캠프]스파르타코딩클럽 AI 웹개발/Today I Learned

[내일배움캠프 36일차 TIL] 장고 기초 게시판 글 작성 및 세부사항 보기

 

 

 

기본 프로젝트 생성

 

필요한 모듈 설치

django-admin startproject second_crud
python -m venv .venv
pip install django==4.2
pip install ipython
pip install django-extensions
pip freeze > requirements.txt

 

 

앱 생성하기

python mange.py startapp post

 

 

 

앱 생성 후엔 앱 등록하기

settings.py 파일에서 추가하기

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'post', # 추가
]

 

 

templates 디렉토리 생성 후 base.html 파일 만들기

 

 

 

 

base.html 파일에서 기본 틀 생성하기

 

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

{% block content %}

{% endblock content%}

</body>
</html>

 

 

 

게시글 작성하기(Create)

 

index 페이지 만들기

 

1.  urls.py 에 적어주기

 

from post import views # view 불러오기

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index, name='index'), # 추가해주기
    
]

 

 

2. views.py에서 함수 생성

 

def index(request):

    return render(request, 'index.html')

 

 

3. index.html 파일 만들기

 

post앱 안에 template 디렉토리 생성 후 index.html 파일 생성

{% extends 'base.html' %}

{% block content %}
<h2>Index</h2>

{% endblock content %}

 

 

결과

 

 

 

게시글 작성하는 페이지 만들기

 

1. urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index, name='index'),
    path('new/', views.new, name = 'new'),  # 여기 추가
]

 

2. views.py

def new(request):
    return render(request, 'new.html')

 

 

3. new.html 생성

 

{% extends 'base.html' %}

{% block content %}
	<h2>게시글 작성하기</h2>
    <form action="" method="POST">
    {% csrf_token %}
        <label for="title">제목</label>
        <input type="text" id="title" name="title"><br><br>

        <label for="content">내용</label>
        <textarea name="content" id="content" cols="30" rows="10"></textarea><br><br>

        <button type="submit">작성완료</button>
    </form>

{% endblock content %}

 

게시글을 데이터베이스에 저장해야 하기 때문에 데이터베이스에 변화가 생김 -> post 방식 사용

post 방식을 사용하면 csrf token이 필요!

 

new 페이지

 

 

 

 

 

모델 생성하기

 

models.py 파일에서 클래스 작성해주기

 

class Post(models.Model):
    title = models.CharField(max_length=50) # 제목의 최대 길이 지정
    content = models.TextField() # 글 내용
    created_time = models.DateTimeField(auto_now_add = True) # 게시글 작성 시간
    updated_time = models.DateTimeField(auto_now = True) # 게시글 수정 시간

 

 

 

 

 

 

 

 

 

게시글 생성(저장)하기

 

1. urls.py

 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index, name='index'),
    path('new/', views.new, name = 'new'),
    path('create/', views.create, name = 'create'), # 추가
]

 

 

 

2. views.py

def create(request):

    title = request.POST.get('title')
    content = request.POST.get('content')

    Post.objects.create(title=title, content=content)

    return redirect('index')

 

new에서 작성한 내용을 불러와서 데이터베이스에 저장하기

저장한 후에는 index 페이지로 이동

 

 

 

3. views.py의 index 함수 수정해주기

 

def index(request):

    posts = Post.objects.all().order_by("-updated_time")
    context = {
        "posts":posts
    }

    return render(request, 'index.html', context)

 

데이터베이스에 있는 모든 게시물들을 불러오고,

가장 최신에 업데이트 된 글이 상단에 오도록 order_by 실행

 context에 담아 게시글 전달

 

 

4. index.html 수정하기

 

index.html 파일에서 게시글의 제목이 보이도록 수정하기

 

{% extends 'base.html' %}

{% block content %}
<h2>Index</h2>
    <a href="{% url 'new' %}"><button>게시글 작성하러 가기</button></a><br><br><br>

    {% for post in posts %}
    	<p>{{ post.id }} . {{ post.title }}</p><br><br><br>
    {% endfor %}

{% endblock content %}

 

 

 

new 페이지에서 게시글을 작성하고 작성 완료 버튼을 누르면 다음과 같은 인덱스 페이지로 이동

 

 

 

 

상세 게시글 보기 페이지 만들기(Read)

 

1. urls.py

 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index, name='index'),
    path('new/', views.new, name = 'new'),
    path('create/', views.create, name = 'create'),
    path('detail/<int:pk>/', views.detail, name = 'detail'), # 추가
]

 

pk 값으로 해당하는 게시글의 세부 내용을 보기

 

 

 

2. views.py

 

def detail(request, pk):

    post = Post.objects.get(pk=pk)

    context = {
        "post":post,
    }

    return render(request, 'detail.html', context)

 

pk 값을 인자로 받아와서 해당하는 게시글을 찾기

context에 담아 전달하기

 

 

 

3. detail.html

{% extends 'base.html' %}

{% block content %}

    <p>제목: {{ post.title }}</p><br>
    <p>내용: {{ post.content }}</p><br>
    <p>작성시간: {{ post.created_time }}</p>
    <p>수정시간: {{ post.updated_time }}</p><br>


    <a href="{% url 'index'%} "><button>글 목록으로 가기</button></a>
{% endblock content %}

 

 

제목 내용 작성시간 수정시간 보여주기

 

 

 

 

4. index.html

 

{% extends 'base.html' %}

{% block content %}
<h2>Index</h2>
    <a href="{% url 'new' %}"><button>게시글 작성하러 가기</button></a><br><br><br>

    {% for post in posts %}
    	<a href="{% url 'detail' post.pk %}">{{ post.id }} . {{ post.title }}</a><br><br><br>
    {% endfor %}
    
{% endblock content %}

 

 

인덱스 페이지에서 게시글 제목을 누르면 해당 게시글의 내용을 볼 수 있도록 수정