본문 바로가기

IT/django(장고)

[django]장고 개발_5 - 리스트, 글쓰기 , 수정 , 삭제 (CRUD)

app/urls.py를 먼저 변경해줘야 돼요.

 

urlpatterns = [ 
    path('',views.index), 
    path('post/', views.post_list, name='post_list'), 
]

 

path('post/', views.post_list, name='post_list'),

urlpatterns에 입력해주세요.

 

from django.shortcuts import render , get_object_or_404  
from .models import Post 

def index(request): 
    posts = Post.objects.all() 
    return render(request , 'app/index.html' , {'posts':posts}) 

def post_list(request): 
    post = Post.objects.all() 
    return render(request, 'app/post_list.html' , {'posts':posts })

 

app/voews.py 안에 render 뒤에 get_object_or_404를 추가해주세요.

코드를 추가해주세요.

하위 app 폴더에 post_list.html 파일을 추가해주세요.

 

{% extends 'app/base.html' %}

{% block content %}
    <ul>
        {% for post in posts %}
           <li>
            {{ post.text }}
            {{ post.published_date  }}
            </li>
        {% endfor %}
    </ul>
{% endblock %}

 

리스트가 보일 수 있게 확장이랑 코딩을 해줘야 돼요.

 

{% extends 'app/base.html' %}

{% block content %}
<h1><a href="{% url 'post_list' %}">Post 리스트</a></h1>
    <ul>
        {% for post in posts %}
           <li>
            {{ post.text }}
            {{ post.published_date  }}
            </li>
        {% endfor %}
    </ul>
{% endblock %}

 

그리고 다시 index.html로 돌아와서 a태그 부분을 입력해주세요

 

이제부터 입력하는 창을 만들어보겠습니다.

 

from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'text']

 

그전에 상위 app폴더에서 forms.py 파일을 생성해주세요.

그리고 코드를 입력해주세요.

from .models # from 다음에 있는 마침표(.)는 현재 디렉터리 또는 애플리케이션을 의미

(.py 확장자를 붙이지 않아도 내용을 가져올 수 있음)

#forms.ModelFormd은 ModeForm이라는 것을 알려주는 구문
    class Meta: #이폼을 만들기 위해서 어떤 model이 쓰여야 하는지 장고에 알려주는 구문

 

from django.urls import path
from . import views

urlpatterns = [
    path('',views.index),
    path('post/', views.post_list, name='post_list'),
    path('post/new' , views.post_new, name='post_new'),
]

 

app/urls.py 파일에서 urlpatterns에 path('post/new' , views.post_new, name='post_new'),

코드를 입력해주세요.

 

from .forms import PostForm

def post_new(request):
    form = PostForm(request.POST)
    return render(request, 'app/post_edit.html' , {'form' : form})

 

app/views.py에도 새로운 코드를 입력해주세요.

 

{% extends 'app/base.html' %}

{% block content %}
    <form method="POST" enctype="multipart/form-data" >
        {% csrf_token %}
	{{form.as_p}}
        <input type="submit" value="저장">
    </form>
{% endblock %}

 

하위 app폴더에 post_edit.html 파일을 생성하고 코드를 입력하시면 리스트에서 새 글을 클릭하시면 글쓰기 창이 만들어질 거예요.

폼이 잘 뜨면 반은 성공한 거예요.

 

path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),

 

이제 app/urls.py 에서 urlpatterns에 코드를 추가해주세요.

 

from django.shortcuts import render , get_object_or_404 ,redirect
from .models import Post
from .forms import PostForm
from django.utils import timezone

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            #commit=False가 있는 이유는 바로 저장안함
            post.author = request.user
            post.published_date = timezone.now()           
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        return render(request, 'app/post_edit.html')

def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'app/post_edit.html', {'form': form })


def post_detail(request, pk):
    post = get_object_or_404(Post,pk=pk)
    return render(request, 'app/post_detail.html' , {'post':post})

 

app/views.py 의 import와 post_new를 변경해주시고, post_edit, post_detail을 추가해주세요.

그리고 저장을 하시면 저장되면서 detail로 넘어가실 거예요.

 

{% extends 'app/base.html' %}

{% block content %}
<h1><a href="{% url 'post_new' %}" >새글</a></h1>
    <ul>
        {% for post in posts %}
           <li>
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
            {{ post.text }}
            {{ post.published_date  }}
            </li>
        {% endfor %}
    </ul>
{% endblock %}

 

app/post_list.html 에서 li안에 a태그를 추가해주세요.

 

urlpatterns = [
    path('',views.index),
    path('post/', views.post_list, name='post_list'),
    path('post/new' , views.post_new, name='post_new'),
    path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
    path('post/<int:pk>/delete', views.post_delete, name='post_delete'),
]

 

app/urls.py에서 delete path를 추가해주세요.

 

def post_delete(request, pk):
    post = Post.objects.get(id=pk)
    post.delete()
    return redirect('/post/')

 

app/views.py에서 post_delete를 추가해주세요.

마지막으로 

 

{% extends 'app/base.html' %}

{% block content %}
    <p><a href="{% url 'post_delete'  pk=post.pk %}">삭제</a></p>
    <a href="{% url 'post_edit' pk=post.pk %}">수정</a>
    <div class="post">
        {% if post.published_date %}
            <div class="date">
                {{ post.published_date }}
            </div>
        {% endif %}
        <h1>{{ post.title }}</h1>
        <p>{{ post.text|linebreaksbr }}</p>
    </div>
{% endblock %}

 

app/post_detail.html에 삭제, 수정을 추가하시면 추가하시면 삭제 , 수정 기능이 작동해요.