published: {{ post.published_date }}
{{ post.title }}
{{ post.text|linebreaksbr }}
Home > Python-Ecosystem > Django > Django 간단한 블로그 만들기
가상환경이란 자신이 원하는 환경을 구축하기 위해 필요한 모듈만 담아 놓는 바구니를 말한다. 프로젝트 기초 전부를 분리해 사용할 수 있기 때문에 유용하다.
먼저, 명령 프롬프트에서 가상환경을 생성할 폴더를 만들고 해당 폴더로 이동한다. 홈 디렉토리(C:\Users\Name)에 생성하면 적당한 선택이다.
mkdir djangogirls
cd djangogirls
그리고 가상 환경을 생성한다. 가상환경을 이름을 설정할 수 있는데 여기서는 myvenv로 생성하기로 한다.
python -m venv myvenv
myvenv\Scripts\activate
만일 실행이 안될 경우, cmd를 관리자 권한으로 실행한다.
pip을 최신 버전으로 업데이트하기
python3 -m pip install --upgrade pip
장고 설치하기
pip install django~=2.0.0
생성할 장고 프로젝트의 구조
djangogirls
├───manage.py
└───mysite
settings.py
urls.py
wsgi.py
__init__.py
(myvenv) C:\Users\Name\djangogirls> django-admin.py startproject mysite .
TIME_ZONE = 'Asia/Seoul'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
(myvenv) ~/djangogirls$ python manage.py migrate
(myvenv) ~/djangogirls$ python manage.py runserver
(myvenv) ~/djangogirls$ python manage.py startapp blog
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
djangogirls
├── mysite
| __init__.py
| settings.py
| urls.py
| wsgi.py
├── manage.py
└── blog
├── migrations
| __init__.py
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── views.py
from django.conf import settings
from django.db import models
from django.utils import timezone
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(
default=timezone.now)
published_date = models.DateTimeField(
blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
python manage.py makemigrations blog
python manage.py migrate blog
admin.site.register(Post)
```
(myvenv) ~/djangogirls$ python manage.py createsuperuser
Username: admin
Email address: admin@admin.com
Password:
Password (again):
Superuser created successfully.
*.pyc
*~
__pycache__
myvenv
db.sqlite3
/static
.DS_Store
git clone https://github.com/<your-github-username>/my-first-blog.git
$ cd my-first-blog
$ virtualenv --python=python3.6 myvenv
Running virtualenv with interpreter /usr/bin/python3.6
[...]
Installing setuptools, pip...done.
$ source myvenv/bin/activate
(myvenv) $ pip install django~=2.0
Collecting django
[...]
Successfully installed django-2.0.6
(mvenv) $ python manage.py migrate
Operations to perform:
[...]
Applying sessions.0001_initial... OK
(mvenv) $ python manage.py createsuperuser
/home/<your-username>/my-first-blog/myvenv/
라고 입력/var/www/<your-username>_pythonanywhere_com_wsgi.py
부분)를 클릭import os
import sys
path = '/home/<your-PythonAnywhere-username>/my-first-blog' # PythonAnywhere 계정으로 바꾸세요.
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
from django.core.wsgi import get_wsgi_application
from django.contrib.staticfiles.handlers import StaticFilesHandler
application = StaticFilesHandler(get_wsgi_application())
"""mysite URL Configuration
[...]
"""
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
from django.contrib import admin
from django.urls import path, include # include 추가
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')), # blog.urls를 가져오는 코드 추가
]
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'), # post_list 뷰를 루트 url에 할당
]
from django.shortcuts import render
# Create your views here.
from django.shortcuts import render
# Create your views here.
def post_list(request):
'''
요청(request)을 넘겨받아 render메서드를 호출한다.
이 함수는 render 메서드를 호출하여 받은(return) blog/post_list.html 템플릿을 보여준다.
'''
return render(request, 'blog/post_list.html', {})
published: 14.06.2014, 12:14
Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
published: 14.06.2014, 12:14
Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut f.
```
from django.shortcuts import render
from django.utils import timezone # 쿼리셋 동작을 위해 추가
from .models import Post # Post 모델을 사용하기 위해 import
def post_list(request):
# 쿼리셋 추가
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts}) # 'posts' 매개변수 추가
<div>
<h1><a href="/">Django Girls Blog</a></h1>
</div>
# 장고 템플릿에서의 루프 테크닉
<head>
에 아래 링크 추가
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
djangogirls
├── blog
│ ├── migrations
│ ├── static
│ └── templates
└── mysite
djangogirls
└─── blog
└─── static
└─── css
└─── blog.css
.page-header h1, .page-header h1 a, .page-header h1 a:visited, .page-header h1 a:active {
color: #ffffff;
font-size: 36pt;
text-decoration: none;
}
.content {
margin-left: 40px;
}
h1, h2, h3, h4 {
font-family: ‘Lobster’, cursive;
}
.date {
color: #828282;
}
.save {
float: right;
}
.post-form textarea, .post-form input {
width: 100%;
}
.top-menu, .top-menu:hover, .top-menu:visited {
color: #ffffff;
float: right;
font-size: 26pt;
margin-right: 20px;
}
.post {
margin-bottom: 70px;
}
.post h1 a, .post h1 a:visited {
color: #000000;
}
```
{% load static %} // 정적 파일 로딩
```
<body>
태그 내용만 바꿔 다음과 같이 base.html에 코드 추가{% load static %}
```
{% extends 'blog/base.html' %}
{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
{% endblock %}