Post

Django 작성 List

참고자료 출처 및 주의사항

Link : Django-02-Django-시작-Hello-World-출력

1
2
아래 2번부터는 정해진 순서는 없고 해보니까 이렇게 하는게 편하다는 것.  
보고 까먹은건 참고에서 다시 확인  

1. models.py

1
2
models.py에는 내가 만들 앱에 적용시킬 class를 만드는 곳.   
models를 db에 연결해줘야 함.  
1
2
python3 manage.py makemigrations 
: 앱 디렉토리 밑에 migrations 폴더를 생성하여 db와 소통시킴.  
1
2
3
python3 manage.py migrate
: db에 최신 models (변경사항) 적용
단, app 디렉토리에 있는 admin.py에 등록.

ex) 블로그 생성을 위한 blog 객체 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.db import models

class Blog(models.Model):
	title = models.CharField(max_length = 200)
  
	writer = models.CharField(max_length = 30, default="anonymous", null=True) 
  # title과 field가 곂쳐서 오류가 나서 수정한 부분. 오류 내용은 까먹음
  
	pub_date = models.DateField('date published')
  
	body = models.TextField()
  
	def __str__(self) : # admin page에서 blog 객체 생성 시 제목을 보여주게끔 설정
		return self.title
    
	def summary(self) :
		return self.body[:100]
1
2
3
4
5
Field는 3개가 사용됬는데

짧은 문장을 담는 CharField
날짜를 담는 DateField
긴 글을 담는 TextField

2. views.py

1
2
3
views.py에는 구체적인 기능을 하는 함수들을 작성함.

ex) blog에서 구현할 login, logout, register, modify 등등
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from django.shortcuts import render, get_object_or_404, redirect # render 제외 2개 추가
from django.utils import timezone
from .models import Blog    ## models.py에 있는 Blog 객체 사용
from django.contrib.auth.models import User # login, logout, register를 위해 추가
from django.contrib import auth # login, logout, register를 위해 추가 

def login(request) :
	if request.method == 'POST' :
		user_id = request.POST['user_id']
		user_pw = request.POST['user_pw']
		user = auth.authenticate(request, username=user_id, password=user_pw)	
		if user is not None :
			auth.login(request, user)	
			return redirect('home')
		else :
			return render(request, 'login.html', {'error': 'ID or PW is incorrect'})
	else :
		return render(request,'login.html')
	
def register(request) :
	if request.method == "POST" :
		if request.POST['user_pw1'] == request.POST['user_pw2'] :
			user = User.objects.create_user( username=request.POST['user_id'], password=request.POST['user_pw1'],
		        				 email=request.POST['user_email'])
			auth.login(request,user)
			return redirect('home')
		else :
			return render(request, 'register.html', {'error' : 'Confirm PW'})	
	return render(request, 'register.html')
	
def logout(request) :
	auth.logout(request)
	return render(request, 'login.html')
	
def home(request):
	blogs = Blog.objects
	return render(request, 'home.html', {'blogs' : blogs})

def detail(request, blog_id):
	blog_detail = get_object_or_404(Blog, pk=blog_id)
	return render(request, 'detail.html', {'blog' : blog_detail})

def write(request) :
	return render(request, 'write.html')

def create(request) :
	blog = Blog()
	blog.title = request.GET['title']
	blog.writer = request.user.get_username()
	blog.body = request.GET['body']
	blog.pub_date = timezone.datetime.now()
	blog.save()
	return redirect('home')

def modify(request, blog_id):
	blog = get_object_or_404(Blog, pk=blog_id)
	if request.method == "POST" :
		blog.title= request.POST['title']
		blog.body = request.POST['body']
		blog.pub_date= timezone.datetime.now()
		blog.save()
		return redirect('/blog/'+str(blog.id)) 
	else :
		return render(request, 'modify.html', {'blog' : blog}) 
		
def delete(request, blog_id):
	blog = Blog.objects.get(pk=blog_id)
	blog.delete()
	return redirect('home')	

pk, path converter, get_object_or_404

Link : ssungkang.tistory.com/entry/Django-06pk-path-converter-getobjector404%EB%9E%80?category=320582

render와 redirect 차이점

Link : ssungkang.tistory.com/entry/Django-render-와-redirect-의-차이?category=320582

1
2
3
4
5
6
7
render(request, template_name, context=None, content_type=None, status=None, using=None)

#request : default 값으로 request 사용하면 됨.
#template_name : 불러오고 싶은 template(html 등) 파일
#context : views.py에서 사용한 변수를 불러올 template에 인자로 넘겨줄 수 있음.
#          dict형으로 key 값이 template에서 사용할 변수명
#          value가 넘겨줄 파이썬 변수
1
2
3
4
5
6
redirect(to, permanent=False, *args, **kwargs)

#to : 이동할 url 주소로 상대, 절대 url 모두 가능함. 
#     urls.py 에 name 을 정의하고 이를 많이 사용함. 
#     단순히 URL로 이동하는 것으로 render 처럼 context 값을 넘기지는 못함.

3. urls.py

1
2
3
4
5
6
7
url를 지정하는 파일

해당 url로 접근 시, views.py에 있는 함수를 실행시킴.
즉, 그 함수가 html 파일을 화면에 보여주는 원리 (using render, redirect)

--> 앱 폴더에서 urls.py를 작성 
--> 그 내용을 프로젝트 폴더에 있는 urls.py에도 작성

3-1. 프로젝트 폴더 안에 있는 urls.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""work URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
	path('admin/', admin.site.urls) 
	path('앱이름/', include('앱이름.urls')), 
]

위에 예제들이 있고 그 중 3번째를 사용

3-2. 앱 안에 있는 urls.py

1
2
3
4
5
6
7
8
9
10
11
12
from django.urls import path
import 앱이름.views  
# 각각의 app에 만든 하위 urls.py는 path에서 VIEW의 정보를 argument로 받기 때문에, 
# 반드시 views.py를 import 해야함!!

urlpatterns = [
	# path('admin/', admin.site.urls)  
    # 기본 urls.py에만 있으면 됨. 거기에 없으면 오류 메세지 출력 
	
  path('',앱이름.views.함수, name='index'),  
    # 경로가 ''이면 접속 시 기본적으로 index.html을 불러오는 것. 
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Example code

from django.urls import path
import blog.views

urlpatterns = [
	path('', blog.views.login, name = 'login'), 
    # 기본 페이지가 login 페이지, views.py에 있는 login 함수를 통해 login.html 페이지를 불러옴.
	path('blog/register', blog.views.register, name = 'register'),
	path('blog/board', blog.views.home, name='home'),
	path('blog/<int:blog_id>', blog.views.detail, name = 'detail'),
	path('blog/write', blog.views.write, name = 'write'),
	path('blog/create', blog.views.create, name = 'create'),
	path('blog/<int:blog_id>/modify', blog.views.modify, name = 'modify'),
	path('blog/<int:blog_id>/delete', blog.views.delete, name = 'delete'),
	path('blog/logout', blog.views.logout, name = 'logout'),
]

# <int:blog_id>는 path converter임.

4. 웹 페이지 상에 보여줄 html 파일 작성

앱 폴더 안에 templates 폴더 생성 후 (앱과 동일한 이름 폴더 생성) html 파일 작성 (views.py에 사용될 html파일)
ex) login.html, detail.html, register.html 등등..

4-1. 템플릿 언어

여기서 템플릿 언어라는 것이 사용됨.
템플릿 언어를 통해 더 많은 기능을 구현 가능

4-2. 쿼리셋과 메소드

참고

5. admin.py

1
python3 manage.py createsuperuser -> admin 계정 생성
1
2
3
4
5
6
7
8
9
10
11
from django.contrib import admin
from .models import 클래스 이름

admin.site.register(클래스이름)

''' ex)
from django.contrib import admin
from .models import Blog

admin.site.register(Blog) # admin 페이지에 Blog 객체 추가
'''
This post is licensed under CC BY 4.0 by the author.