흐름
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 |