CRUD 구현

justyoon·2023년 4월 13일
0
post-thumbnail

목차

  • 컨셉정하기 + 기능 추가
  • base.html 설정
  • 더미데이터 준비 및 생성
  • 페이지 만들기
  • 게시글 순서 변경
  • csrf token
  • redirect
  • detail 페이지
  • update
  • delete

base.html 설정

출력화면

`!`를 누르면 html뼈대를 불러올 수 있습니다.

보일러 플레이트 코드란?
그리고 Bootstrap이 제공하는 css를 import합니다.

출력화면

base.html을 원하는 템플릿에 extends 함으로써 [상속](링크)할 수 있습니다.
+ jQuery같은 경우도 script부분을 import 해놓으면 똑같이 상속할 수 있습니다.

더미데이터 준비

index 페이지 만들기

출력화면

마진이 없으니 이상합니다.
class container를 <body>에 입력해줍니다.
<body class="container">

출력화면

여백이 생겼습니다.

더미데이터 생성

출력화면

admin페이지로 돌아와 article들을 몇개 더 생성해 줍니다

페이지 만들기

dinner.html 페이지와 연결되는 urls path 경로는 views.dinner와 연결됩니다.

# urls.py
path('dinner/<str:name>/', views.dinner), views.py/dinner
]

model 받아오기 위해 같은 폴더안의 models.py를 import 해주겠습니다.

# models.py
from django.db import models

# Create your models here.
class Article(models.Model): # 상속
    # 기본키(Primary Key=PK) "id(PK)"와 "created_at" field는 
    # django.db에서 import되어 db에 자동으로 생성됩니다.
    title = models.CharField(max_length=10)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
  • import를 할때는 필요한 모델만 하는것이 좋습니다.
  • 다른 앱의 모델을 import할때는 앱이름.models 형식으로 가능합니다.
import random
from django.shortcuts import render
>>from .models import Article

장고 쿼리문 참고하기
데이터를 불러오는 여러 쿼리문이 있습니다. 공식문서를 참고하면서 작성하겠습니다.

# dinner views
def dinner(request, name):
...
  >>articles = Article.objects.all()
    context = {
        'pick': pick,
        'name': name,
        'menus': menus,
      >>'articles': articles,
    }
불러올 데이터 모델의 변수를 articles로 선언 해줍니다.
모든 Article을 불러옵니다.
{% endif %} 

<h1>어떤 게시글 기능올 불러올 곳입니다</h1>
{% for article in articles %}
<p>글 번호: {{ article.pk }}</p>
<p>글 제목: {{ article.title }}</p>
<p>글 내용: {{ article.content }}</p>
<hr /> <!-- 구분선입니다 -->
{% endfor %} {% endblock %} 

출력화면

다른 페이지 연결하기

HTML 속성 참고하기
새로운 페이지로 연결 시켜 보겠습니다.

{% extends 'base.html' %} {% block content %}

<!-- Bootstrap css 사용을 위한 class입니다 -->
<form 
    class="form-group" 
    action="{% url 'articles:create_review' %}" 
    method="POST"
>
    {% csrf_token %}
    <label for="title">제목은: </label>
    <!-- 입력창 -->
    <input class="form-control" type="text" name="title" /><br />
    <label for="content">내용은: </label>
    <textarea class="form-control" name="content" cols="30" row="5"></textarea
    ><br /> 
    <!--제출버튼-->
    <input type="submit" />
</form>

{% endblock %}

출력화면

게시글 순서 변경하기

제목&내용 연결&저장하기

titlecontent를 연결하고 제목과 내용을 입력하면 저장될 수 있도록합니다.

#views.py
from django.shortcuts import render, >>redirect #redirect를 추가해줍니다
import random
from .models import Article
...
...
def create_review(request):
    content = request.POST.get('content')
  >>title = request.POST.get('title')
  >>article = Article(title=title, content=content)
  >>article.save() # 저장
    
# context는 DB 모델을 활용하면 필요하지 않습니다
#    context = {
#        'content': content,
#    }
    
#     return render(request, 'review_result.html') 
# 리뷰작성이 완료되면 생성된 list 페이지를 보여주어야 합니다. 
# 아래 redirect를 사용한 식으로 바꾸어줍니다
    >>return redirect('/articles/dinner/무언가/')

출력화면

페이지는 잘 연결되었지만 최근에 작성된 순서대로 배치되지 않았습니다. 

게시글을 가장 최근에 입력된 순서로 배치해보겠습니다.

# dinner views
def dinner(request, name):
    ...
   #articles = Article.objects.all() #모든Article불러옵니다
  >>articles = Article.objects.order_by('-pk') #pk의 역순(즉 게시id역순)

역순으로 배열된 화면
DB에 저장된 제목과 내용 field

상세페이지로 이동하기

게시글을 클릭하면 상세페이지로 이동하도록 설계해보겠습니다.
방법으로는 이전에 사용했던 path variable(경로 변수)를 사용하겠습니다.

  • path ('dinner/<str:name>/', views.dinner)

게시글 번호를 받아서 url에 번호를 입력하면 해당 페이지로 이동하게 됩니다.

profile
with gratitude, optimism is sustainable

0개의 댓글

관련 채용 정보