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)
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 |
댓글