$ python3 -m venv [원하는 가상환경 이름(나는 venv)]
deactivate
입력<mac os>
$ source venv(앞에서 설정한 이름)/bin/activate
<window>
$ source [가상환경 이름]/Scripts/activate
command + shift + p
를 눌러 설정창 열기pip3 list
눌러 깔려있는 항목 확인$ pip3 install django
gitignore
설치
https://www.toptal.com/developers/gitignore/
에서 나의 조건에 맞게 내용을 입력해서 파일 다운 (팀플 진행시에는 그냥 나에게 포함된 내용 다 치면 됨!).gitignore
파일을 생성하고 위 내용 복붙### Django ###
*.log
*.pot
*.pyc
__pycache__/
local_settings.py
db.sqlite3
db.sqlite3-journal
media
venv
git repository
와 내 로컬 파일 연결
$ git init
$ git remote add origin https://github.com/레포 주소~~~
$ git add .
$ git commit -m 'initial commit'
$ 만약 메인 브랜치 이름이 master일 경우 바꾸고 싶다면
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
$ git push origin main
django project 시작하기
$ django-admin startproject what_should_i_eat_today .
manage.py
가 현재 폴더에 생성되었으면 잘한 것!변경사항이 생겼으니 바로 깃 커밋
우리가 설치한 모듈을 requirements.txt
로 만들어 관리
$ pip3 freeze > requirements.txt
pip install -r requirements.txt
를 사용하면 깔린 모듈을 한 번에 깔 수 있음!지금까지 진행한 설정 결과
app
들의 집합what_should_i_eat_today
폴더 안에 있는 파일들__init__.py
하나의 파이썬 패키지로 다루도록
지시settings.py
urls.py
wsgi.py
asgi.py
wsgi.py
보다 성능이 좋은 친구$ python manage.py startapp articles
admin.py
apps.py
models.py
tests.py
views.py
what_should_i_eat_today/settings.py
에 생성한 app의 등록을 진행#### 상단 생략 ####
# Application definition
INSTALLED_APPS = [
'articles',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#### 하단 생략 ####
# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
#### 하단 생략 ####
$ python manage.py runserver
urls.py
라는 파일을 통해 모든 url을 관리urls.py
가 있고, 각 app마다 urls.py
를 가지고 있음urls.py
를 전체 프로젝트의 urls.py
에 알려주어야 사용할 수 있음articles
app에 있는 views.py의 함수를 url을 연결함으로 인해 사용하도록 할 것이다. 따라서 articles
app에서 views.py를 import하도록 할 것이다. __init__.py
로 인해 각 app들이 모듈로서 사용되기 때문이다. what_should_i_eat_today/urls.py
include
를 사용해 리팩토링할 예정from django.contrib import admin
from django.urls import path
from articles import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
index/
로 들어가면 실행될 index
함수가 정의되지 않아서임!articles/views.py
를 수정해야 함views.index
의 index와 함수 이름이 꼭 반드시 무조건 동일해야 함request
가 첫 번째임!from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'index.html')
index.html
을 생성templates
폴더 안에 생성해야 하며, templates
폴더는 각 app 안에 생성하도록 함index.html
을 생성하고 다시 서버를 돌리게 되면 아래의 결과가 나옴dinner/
을 만들어 오늘 저녁으로 뭘 먹을지 작성해보자what_should_i_eat_today/urls.py
from django.contrib import admin
from django.urls import path
from articles import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('dinner/', views.dinner),
]
articles/views.py
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'index.html')
def dinner(request):
return render(request, 'dinner.html')
templates/dinner.html
을 만든 후, 일단 되나 시험articles/views.py
import random
from django.shortcuts import render
# Create your views here.
def dinner(request):
menus = ['족발', '햄버거', '치킨', '삼겹살']
pick = random.choice(menus)
context = {
'pick': pick,
}
return render(request, 'dinner.html', context)
templates/dinner.html
<h1>오늘 저녁은 [{{ pick }}]입니다.</h1>
what_should_i_eat_today/urls.py
: dinner url의 개인화 진행<str:name>
와 같이 정수인지 문자인지 정해주어야 함from django.contrib import admin
from django.urls import path
from articles import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('dinner/<str:name>/', views.dinner),
]
articles/views.py
context
에 인자로 받은 name 추가해 프론트로 같이 쏴줌> import random
from django.shortcuts import render
# Create your views here.
def dinner(request, name):
menus = ['족발', '햄버거', '치킨', '삼겹살']
pick = random.choice(menus)
context = {
'pick': pick,
'name': name,
}
return render(request, 'dinner.html', context)
templates/dinner.html
<h1>오늘 {{ name }}님의 저녁은 [{{ pick }}]입니다.</h1>
- 공홈 링크 : 템플릿
for문과 if문을 활용
해 저녁 리스트 작성articles/views.py
import random
from django.shortcuts import render
# Create your views here.
def dinner(request, name):
menus = [{'name': '족발', 'price': 35000},
{'name': '햄버거', 'price': 9000},
{'name': '치킨', 'price': 18000},
{'name': '삼겹살', 'price': 12000}]
pick = random.choice(menus)
context = {
'pick': pick,
'name': name,
'menus': menus,
}
return render(request, 'dinner.html', context)
templates/dinner.html
for문
을 활용해 리스트의 모든 내용을 다 불러옴if문
을 활용해 조건에 맞는 내용을 출력해줌띄어쓰기
를 꼭 준수해야 함!<h1>오늘 {{ name }}님의 저녁은 [{{ pick.name }}]입니다.</h1>
<h1>메뉴 리스트</h1>
<ul>
{% for menu in menus %}
<li>{{ menu.name }} : {{ menu.price }} 원</li>
{% endfor %}
</ul>
{% if pick.price > 20000 %}
<p>비싸다,,,</p>
{% elif pick.price > 10000 %}
<p>해볼만하다,,!</p>
{% else %}
<p>맛있겠다!!</p>
{% endif %}
action
과 method
를 잘 작성해야 함action
: 어느 페이지로 이동할 것인지method
: get인지 post인지 작성review.html
에서 보낸 내용을 review_result.html
에서 볼 수 있도록 진행request
는 요청에 대한 모든 정보를 담고 있는 변수what_should_i_eat_today/urls.py
from django.contrib import admin
from django.urls import path
from articles import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('dinner/<str:name>/', views.dinner),
path('review/', views.review),
path('create_review/', views.create_review),
]
articles/views.py
#### 상단 생략 ####
def review(request):
return render(request, 'review.html')
def create_review(request):
content = request.POST.get('content')
print(content)
context = {
'content': content,
}
return render(request, 'review_result.html', context)
templates/review.html
<form action="/create_review/" method="POST">
{% csrf_token %}
<label for="content">보낼 메세지 : </label>
<input type="text" id="content" name="content" />
<button type="submit">보내기</button>
</form>
templates/review_result.html
<h1>여기서 받은 내용은 {{ content }}야!</h1>
$ python manage.py startapp foods
what_should_i_eat_today/settings.py
#### 상단 생략 ####
# Application definition
INSTALLED_APPS = [
'articles',
'foods',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#### 하단 생략 ####
include
를 사용하도록 함what_should_i_eat_today/urls.py
foods
ap의 url도 아래와 같이 작성하면 됨from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('articles/', include('articles.urls')),
path('foods/', include('foods.urls')),
]
articles
app에도 urls.py
를 만듦from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index),
path('dinner/<str:name>/', views.dinner),
path('review/', views.review),
path('create_review/', views.create_review),
]
articles/urls.py
name=url이름
을 설정해주면 url을 사용하면서 name을 주소대신 사용할 수 있음변수 안의 내용이 변경된다해도 문제될 것이 없음
모든 곳에 똑같이 적용
됨app의 이름도 아래와 같이 선언
해줄 수 있음app별로 똑같은 이름의 url
을 가질 수 있음index.html
과 같은 파일은 각 app별로 각각 많이 쓰이기 때문에 이렇게 이름을 설정하게 되면 충돌되지 않고 모두 사용 가능from django.urls import path
from . import views
app_name = 'articles'
urlpatterns = [
path('index/', views.index),
path('dinner/<str:name>/', views.dinner),
path('review/', views.review, name='review'),
path('create_review/', views.create_review, name='create_review'),
]
templates/review.html
{% 'url articles:create_review' %}
<form action="{% url 'articles:create_review' %}" method="POST">
{% csrf_token %}
<label for="content">보낼 메세지 : </label>
<input type="text" id="content" name="content" />
<button type="submit">보내기</button>
</form>
template 상속
templates/base.html
작성<h1>헤더 부분</h1>
{% block content %}
{% endblock %}
<h1>푸터 부분</h1>
templates/dinner.html
변경{% extends 'base.html' %}
{% block content %}
<h1>오늘 {{ name }}님의 저녁은 [{{ pick.name }}]입니다.</h1>
<h1>메뉴 리스트</h1>
<ul>
{% for menu in menus %}
<li>{{ menu.name }} : {{ menu.price }} 원</li>
{% endfor %}
</ul>
{% if pick.price > 20000 %}
<h2>비싸다,,,</h2>
{% elif pick.price > 10000 %}
<h2>해볼만하다,,!</h2>
{% else %}
<h2>맛있겠다!!</h2>
{% endif %}
{% endblock %}
base.html
과 dinner.html
에 모두 {% block content %}{% endblock %}
이 있고 content라는 이름 또한 같다는 것을 알 수 있음 (반드시 같아야 함)dinner.html
에서 {% extends 'base.html' %}
을 통해 base.html의 헤더와 푸터 부분을 상속받았으므로 {% block content %}{% endblock %}
안에 있는 내용이 들어가 웹페이지가 아래와 같이 변하는 것base.html
의 {% block content %}{% endblock %}
에 상황에 맞는 html 파일들의 {% block content %}{% endblock %}
내용들이 들어가게 되는 것!SQLite Viewer
설치articles/models.py
from django.db import models
# Create your models here.
class Article(models.Model): # 상속
title = models.CharField(max_length=10)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
Model
을 커맨드 + 클릭
하게 되면 models 안에 있는 class Model의 정보를 볼 수 있음. 해당 페이지에서 어떤 것을 상속받아 사용할 수 있는지 확인 가능$ python manage.py makemigrations
$ python manage.py migrate
0001_initial.py
를 누르면 자세한 내용 확인 가능db.sqlite3
에 들어가서 확인$ python manage.py sqlmigrate [app name] 0001
$ python manage.py createsuperuser
articles/admin.py
from django.contrib import admin
from .models import Article
# Register your models here.
admin.site.register(Article)
+추가
를 눌러 새로운 요소를 입력할 수 있음{% block content %}{% endblock %}
작성<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
<title>오늘 뭐먹지??</title>
</head>
<body class="container">
{% block content %}
{% endblock %}
<!-- JavaScript Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</body>
</html>
articles/views.py
import random
from django.shortcuts import render
from .models import Article
# Create your views here.
def dinner(request, name):
menus = [{'name': '족발', 'price': 35000}, {'name': '햄버거', 'price': 9000}, {'name': '치킨', 'price': 18000}, {'name': '삼겹살', 'price': 12000}]
pick = random.choice(menus)
articles = Article.objects.order_by('-pk')
context = {
'pick': pick,
'name': name,
'menus': menus,
'articles': articles,
}
return render(request, 'dinner.html', context)
#### 하단 생략 ####
templates/dinner.html
{% extends 'base.html' %}
{% block content %}
<h1>오늘 {{ name }}님의 저녁은 [{{ pick.name }}]입니다.</h1>
<h1>메뉴 리스트</h1>
<ul>
{% for menu in menus %}
<li>{{ menu.name }} : {{ menu.price }} 원</li>
{% endfor %}
</ul>
{% if pick.price > 20000 %}
<h2>비싸다,,,</h2>
{% elif pick.price > 10000 %}
<h2>해볼만하다,,!</h2>
{% else %}
<h2>맛있겠다!!</h2>
{% endif %}
<br />
<h1>리뷰 리스트</h1>
{% for article in articles %}
<p>글 번호 : {{ article.pk }}</p>
<p>글 제목 : {{ article.title }}</p>
<p>글 내용 : {{ article.content }}</p>
<hr />
{% endfor %}
{% endblock %}
articles/review.html
{% extends 'base.html' %}
{% block content %}
<form class="form-group" action="{% url 'articles:create_review' %}" method="POST">
{% csrf_token %}
<label for="title">Title : </label>
<input class="form-control" type="text" name="title" /><br />
<label for="content">Content : </label>
<textarea class="form-control" name="content" cols="30" rows="5"></textarea><br />
<button type="submit">보내기</button>
</form>
{% endblock %}
articles/views.py
import random
from django.shortcuts import render, redirect
from .models import Article
# Create your views here.
#### 상단 생략 ####
def create_review(request):
title = request.POST.get('title')
content = request.POST.get('content')
article = Article(title=title, content=content)
article.save()
return redirect('/articles/dinner/messi')