본문 바로가기
코딩(개발)/Django

admin 셋팅 및 DB 입출력

by 플랜데버 2021. 1. 8.

blog > models.py

from django.db import models
from django.urls import reverse

# Create your models here.
#글의 분류(일상,유머,정보)
class Category(models.Model):
    name = models.CharField(max_length=50 , help_text = "블로그 글의 분류를 입력하세요(ex:일상") #필드

    def __str__(self):
        return self.name

#블로그 글(제목,작성일,대표이미지,내용,분류)        
class Post(models.Model):
    title = models.CharField(max_length=200)
    title_image = models.ImageField(blank=True)
    content = models.TextField()
    createDate = models.DateTimeField(auto_now_add=True)
    updateDate = models.DateTimeField(auto_now_add=True)
    
    # 하나의 글을 여러가지의 분류에 해당 될수 있다,하나의 분류에는 여러가지 글이 포함될수 있다 (다대다)
    category = models.ManyToManyField(Category, help_text="글의 분류를 설정하세요")

    def __str__(self):
        return self.title

    #1번 글의 경우 -> single/1 페이지로 오기위해 설정
    def get_absolute_url(self):
        return reverse("single", args=[str(self.id)])

 

mywebsite > settings.py 에 내용 추가

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

mywebsite > urls.py 에 내용 추가

 

 

 

이미지 모듈 설치

pip install Pillow

 

변경사항을 확인

(myvenv) E:\DjangoWorkspace\mywebsite>python manage.py makemigrations

잘 생성 되었으면 아래와 같은 메시지 뜬다.

 

 

(myvenv) E:\DjangoWorkspace\mywebsite>python manage.py migrate

DB 에 실제로 migrate 한다

 

관리자 계정 만들기

(myvenv) E:\DjangoWorkspace\mywebsite>python manage.py createsuperuser

username / email / password 넣고 확인

 

 

주소창에 http://127.0.0.1:8000/admin

관리자 로그인 가능 함

 

 

한글로 바꾸기

mywebsite > setting.py 

LANGUAGE_CODE = 'ko-kr'

 

 

한글로 바뀜

 

admin 페이지에 위에서 추가한 메뉴를 알려줘야 한다. 코드 추가

blog > admin.py 

from django.contrib import admin
from blog.models import Category,Post

# Register your models here.
admin.site.register(Category)
admin.site.register(Post)

추가 결과 : 위쪽에 BLOG 추가 된 내용이 보인다.

 

 

Categorys 추가

Posts 추가

 

글 내용을 내 블로그 index.html에 표현 하기 위해 아래 작업 한다.(추가된 영역 bold)

1. blog > views.py 

from django.shortcuts import render
from blog.models import Category,Post

# Create your views here.
def index(req):
    post_latest = Post.objects.order_by("-createDate")[:6] #최근 작성된 순 6개 가져온다
    context = {
        "post_latest":post_latest # post_latest 라는 이름으로 index 페이지에 전달한다.

    }

    return render(req, "index.html", context=context)

def single(req):
    context = {
    }

    return render(req, "single.html", context=context)    

 

*index.html 페이지에서 호출한다.

 

 {% for post in post_latest %} >>>> 데이터 루프
        {% if forloop.first %} >>>> 첫번째 목록이라면
        {% else%} >>>> 나머지라면
        {% endif %}
 {% endfor %}

 

글자수 제한 

blog > models.py 에 내용 추가

    def is_content_more120(self):
        return len(self.content) > 120

    def get_content_under120(self):
        return self.content[:120]

 

index.html 파일에 코드 수정 for 문 사이에 넣는다.

<div class="col-md-12 d-flex ftco-animate">
                  <div class="blog-entry align-self-stretch d-md-flex">
                    <a href="{% url 'single' %}" class="block-20" style="background-image: url({% static 'images/image_1.jpg'%});">
                    </a>
                    <div class="text d-block pl-md-4">
                      <div class="meta mb-3">
                        <div><a href="#">[{{ forloop.counter }}]{{ post.createDate}}</a></div> <!--날짜-->
                        <div><a href="#"><!--카테고리-->
                          {% for c in post.category.all %}
                            {{ c }}
                            {% if not forloop.last %}
                              ,
                            {% endif%}
                          {% endfor %}
                        </a></div>
                        <div><a href="#" class="meta-chat"><span class="icon-chat"></span> 3</a></div>
                      </div>
                      <h3 class="heading"><a href="#">{{ post.title }}</a></h3>
                      <p><!--본문-->
                        {% if post.is_content_more120 %}
                          {{ post.get_content_under120}}
                        {% else %}
                          {{ post.content }}
                        {% endif %}
                      </p>
                      <p><a href="{% url 'single' %}" class="btn btn-primary py-2 px-3">Read more</a></p>
                    </div>
                  </div>
                </div>

서브 페이지 내용 출력하기

 

blog > view.py

from django.views import generic

# def single(req):

#     context = {

#     }

 

#     return render(req, "single.html", context=context)    

 

#위 싱글을 다른이름으로 작업

# 장고에서 제공하는 post로 요청한 상세페이지 보기

class PostDetailview(generic.DetailView):

    model = Post

blog > urls.py 로 와서 접근규칙 정의한다

#path("single/", views.single, name="single"),

    #위 내용을 바꿔준다.

  path("post/<int:pk>", views.PostDetailview.as_view(), name="post"),

blog > models.py 로 와서

#return reverse("single", args=[str(self.id)])
  return reverse("post", args=[str(self.id)]) #post/1 로 받는다.

index.html 파일에서

{% url 'single' %} → {{ post.get_absolute_url}} 변경한다.

 


*서브 페이지 옮기기

templates > blog 만들고

기존 single.html 파일을 post_detial.html 로 변경한 후 blog 폴더로 이동한다.

타이틀,날짜,컨텐츠를 index 페이지에서 사용한 코드와 동일하게 바꿔준다.

 

- 이미지 처리 - 이미지 있는지 체크하고 이미지 넣는 코드 삽입

{% if post.title_image %}
<p>
<img src="{{ post.title_image.url }}" alt="" class="img-fluid">
</p>
{% endif %}

           

 

'코딩(개발) > Django' 카테고리의 다른 글

홈페이지 제작 실습 STEP 1 (앱추가및연결)  (0) 2021.01.16
장고개발을 위한 VS CODE 설정  (0) 2021.01.10
글 작성  (0) 2021.01.09
static 파일 설정  (0) 2021.01.08
Django 설치 및 기본 셋팅  (0) 2021.01.07

댓글