본문 바로가기

Web Programming/Django

Blog 프로젝트 정리

흐름


1. 가상환경 실행 - 프로젝트 만들기 - 앱 만들기(Blog, Portfolio, Accounts) - 앱 연결 

2. Model 제작 

3. Static 처리 

4. Media 처리

5. url 만들기(include, 각각의 앱에 urls.py) 

6. template 파일 

7. view 처리 

8. 그외 기능 추가



1. 가상환경 실행, 프로젝트 만들기, 앱 만들기, 앱 연결


먼저 Blog 프로젝트를 만들기에 앞서 가상환경을 실행하고 프로젝트와 앱을 만든다.


1
2
3
4
5
$ source myvenv/Scripts/activate
$ django-admin startproject BlogProject
$ python manage.py startapp blog
$ python manage.py startapp portfolio
$ python manage.py startapp accounts 
cs


그리고 project에 해당 App들을 연결해준다.


1
2
3
4
5
6
7
# settings.py
INSTALLED_APPS = [
    'blog.apps.BlogConfig',
    'portfolio.apps.PortfolioConfig',
    'accounts.apps.AccountsConfig',
    ...
]
cs


2. Model 제작


그리고 Blog 모델과 Portfolio 모델을 만들어준다.

각각의 해당되는 앱에 들어가서 models.py에 작성해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
# blog/models.py
class Blog(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    body = models.TextField()
 
    # title로 객체를 가르키기
    def __str__(self):
        return self.title
 
    # 내용 줄이기
    def summary(self):
        return self.body[:100]
cs


1
2
3
4
5
6
7
8
# portfolio/models.py
class Portfolio(models.Model):
        title = models.CharField(max_length=255)
        image = models.ImageField(upload_to='images/')
        description = models.CharField(max_length=500)
    
        def __str__(self):
            return self.title
cs


모델을 만들었으면 DB에 migrate 처리를 해준다


1
2
$ python manage.py makemigrations  # 마이그레이션 파일 만들기
$ python manage.py migrate           # 마이그레이트 
cs


3. Static 처리


그리고 이미지와 css, js 등을 static을 통해 관리하기 위해 static 처리를 해준다.

Portfolio에서 이미지를 사용할 예정이므로 Portfolio app 폴더 안에 static 폴더를 만들어준다.

그리고 settings.py에 이를 알려준다.


1
2
3
4
5
6
7
# settings.py
 
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'portfolio''static')
]
 
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
cs


그리고 다음의 명령어를 통해 static 파일들을 모아준다.


1
$ python manage.py collectstatic # static 파일 모으기 
cs


다음, 이미지나 css 등의 사용을 원하는 html 파일에 다음의 코드를 추가한다.


1
{% load staticfiles %}
cs


그리고, 아래의 코드와 같은 형식을 통해 얼마든지 static 파일들을 사용할 수 있다.


1
<img src="{% static 'post.png' %}" alt="">
cs


4. Media 처리


Media도 마찬가지로 settings.py에 다음의 코드를 통해 명시해준다.


1
2
3
# settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
cs


그리고 Media 들이 타고 다니는 url을 설정해주기 위해 urls.py에 해당 내용을 작성해준다.


1
2
3
4
5
6
7
8
from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
 
urlpatterns = [
    ...
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
cs


그리고 다음의 package 설치를 해줍니다


1
$ pip install Pillow
cs


마지막으로 admin site에 포트폴리오 모델을 register 해줍니다


1
2
3
4
5
# admin.py
from .models import Portfolio
 
# Register your models here.
admin.site.register(Portfolio)
cs


5. url 만들기


각각의 app 안에 urls.py 파일을 만들어준다.

그리고 각각 app에 해당하는 urls 파일 내용을 작성해준다.


1
2
3
4
5
6
7
8
9
# blog/urls.py
from django.urls import path
from . import views
 
urlpatterns=[
    path('<int:blog_id>', views.detail, name="detail"),
    path('new/', views.new,name="new"),
    path('create/', views.create, name='create'),
]
cs


1
2
3
4
5
6
7
8
9
# acoounts/urls.py
from django.urls import path
from . import views
 
urlpatterns = [
    path('signup/', views.signup, name='signup'),
    path('login/', views.login, name='login'),
    path('logout/', views.logout, name='logout'),
]
cs


1
2
3
4
5
6
7
# portfolio/urls.py
from django.urls import path
from . import views
 
urlpatterns=[
    path('portfolio/', views.portfolio, name='portfolio'),
]
cs


그리고 project의 urls.py에 가서 include로 포함을 시켜준다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# blogProject/urls.py
from django.contrib import admin
from django.urls import path, include
import blog.views
import portfolio.views
from django.conf import settings
from django.conf.urls.static import static
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', blog.views.home, name='home'),
    path('blog/',include('blog.urls')),
    path('portfolio/',include('portfolio.urls')),
    path('accounts/',include('accounts.urls')),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 
cs


6. template 만들기


template 만들기는 먼저 계속 틀이 될 navbar와 footer에 해당되는 내용은 프로젝트 내에 templates 폴더 내에 base.html을 만든다.

base.html에 양식을 만들고 내용이 들어갈 중간 부분에 다음과 같은 코드를 입력해준다.


1
2
{% block content %}
{% endblock %}
cs


그리고 settings.py에 base.html 양식의 위치를 명시해준다.


1
2
3
4
5
6
7
8
# settings.py
TEMPLATES= [
    {
    ...
    'DIRS' :['project/templates'],
    ...
    }
]


그리고 원하는 html 에 들어가서


1
2
3
4
{% extends 'base.html' %}
{% block content %}
...
{% endblock %}
cs


다음의 양식을 입력해준다.


7. view 작성하기


각각의 app에 해당하는 views.py를 입력해주는데 해당 기능에 맞게 입력해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# blog/views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from .models import Blog
from django.core.paginator import Paginator
 
# Create your views here.
def home(request):
    blogs = Blog.objects 
blog_list = Blog.objects.all().order_by('-id') # 블로그 객체 최신순나열
    paginator = Paginator(blog_list, 3# 3개씩 잘라내기
    page = request.GET.get('page'# 페이지 번호 알아오기
    posts = paginator.get_page(page) # 페이지 번호 인자로 넘겨주기
    return render(request, 'home.html', {'blogs' :blogs, 'posts': posts})
 
# 블로그 글 상세읽기
def detail(requset,blog_id):
    blog_detail = get_object_or_404(Blog,pk=blog_id) # 해당 객체 반환
    return render(requset,'detail.html',{'blog':blog_detail})
 
# 새 블로그 글 만들기
def new(request):
    return render(request, 'new.html')
 
def create(request):
    blog = Blog()
    blog.title = request.GET['title']
    blog.body = request.GET['body']
    blog.pub_date = timezone.datetime.now()
    blog.save()
    return redirect('/blog/' + str(blog.id))
cs


1
2
3
4
5
6
7
8
# portfolio/views.py
from django.shortcuts import render
 
from .models import Portfolio
 
def portfolio(request):
    portfolios = Portfolio.objects
    return render(request, 'portfolio.html', {'portfolios': portfolios})
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# accounts/views.py
 
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib import auth 
 
# Create your views here.
def signup(request):
    # 포스트 방식으로 들어오면
    if request.method == 'POST':
        # 비밀번호 확인도 같다면
        if request.POST['password1'==request.POST['password2']:
            # 유저 만들기
            user = User.objects.create_user(username=request.POST['username'], password=request.POST['password1'])
            auth.login(request,user) #로그인
            return redirect('home'# 블로그페이지
    # 포스트 방식 아니면 페이지 띄우기
    return render(request, 'signup.html')
 
 
def login(request):
    # 포스트 방식으로 들어오면
    if request.method == 'POST':
        # 정보 가져와서 
        username = request.POST['username']
        password = request.POST['password']
        # 로그인
        user = auth.authenticate(request, username=username, password=password)
        # 성공
        if user is not None:
            auth.login(request, user)
            return redirect('home')
        #실패
        else:
            return render(request, 'login.html', {'error''username or password is incorrect.'})
    else:
        return render(request, 'login.html')
 
def logout(request):
    # 포스트 방식으로 들어오면
    if request.method == 'POST':
        # 유저 로그아웃
        auth.logout(request)
        return redirect('home')
    return render(request, 'accounts/signup.html')
cs


8. 그 외 기능 추가하기


페이지네이션 등등...(위에 view는 이미 적용되어 있음)

'Web Programming > Django' 카테고리의 다른 글

Django 장고 텍스트에디터 사용하기(CKeditor)  (4) 2019.02.19
Form 활용하기  (0) 2019.02.16
페이지 나누기(Pagination)  (0) 2019.02.10
로그인 & 회원가입  (0) 2019.02.09
가짜 데이터 만들기(Faker 패키지)  (0) 2019.02.09