장고:글쓰기: 두 판 사이의 차이

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동
1번째 줄: 1번째 줄:
{{장고}}
{{장고}}


==개요==
=개요=
글쓰기 기능을 구현하기 위해 정리한 문서.
글쓰기 기능을 구현하기 위해 정리한 문서.


기본적으로 포스팅 기능이지만, 모델명을 Post로 하기엔 전송방식인 post와 혼동이 오곤 해서 question으로 구현한다.
기본적으로 포스팅 기능이지만, 모델명을 Post로 하기엔 전송방식인 post와 혼동이 오곤 해서 question으로 구현한다.


==url 작성==
=url 작성=
urls.py 안에 필요한 기능을 다 담아주어야 한다.
urls.py 안에 필요한 기능을 다 담아주어야 한다.


예컨대, 글을 쓴다면 만들기, 편집, 삭제기능을 만들어주어야 하기에 다음과 같이 기입한다.
예컨대, 글을 쓴다면 만들기, 편집, 삭제기능을 만들어주어야 하기에 다음과 같이 기입한다.


(뷰의 설정이나, import방식에 따라 뷰를 불러오는 방식이 달라질 수 있다.)<syntaxhighlight lang="python">
(뷰의 설정이나, import방식에 따라 뷰를 불러오는 방식이 달라질 수 있다.)
{| class="wikitable"
|+
!일반적으로 코드를 짜는 경우
!제네릭 뷰를 사용하는 경우
|-
|<syntaxhighlight lang="python">
from django.urls import path
from django.urls import path
from . views #해당 앱의 뷰를 불러온다.
from . views #해당 앱의 뷰를 불러온다.
24번째 줄: 30번째 줄:
     path('question/delete/<int:question_id>/', views.delete, name='delete'),#글의 삭제화면
     path('question/delete/<int:question_id>/', views.delete, name='delete'),#글의 삭제화면
]
]
</syntaxhighlight><nowiki>#</nowiki>아직 함수를 짜주진 않았지만, 앞으로 만들 함수에 대해 연결해두자.
</syntaxhighlight>
|함수명을 바꾸어주어야 한다.
views.클래스뷰명.as_view()), 형태로.
 
클래스형 뷰임을 지정해주기 위해.
|}
<nowiki>#</nowiki>아직 함수를 짜주진 않았지만, 앞으로 만들 함수에 대해 연결해두자.


==모델 작성==
=모델 작성=
글에서 포함해야 할 것들이 있다. 작성자, 작성일자, 내용 등의 요소를 포함하여 모델을 작성한다.
글에서 포함해야 할 것들이 있다. 작성자, 작성일자, 내용 등의 요소를 포함하여 모델을 작성한다.


51번째 줄: 63번째 줄:
이상이 없으면 뷰 작성으로 넘어가자.
이상이 없으면 뷰 작성으로 넘어가자.


= 뷰 작성 =
=뷰 작성=


== 리스트 보기 ==
==리스트 보기==
{| class="wikitable"
{| class="wikitable"
!
!
!
!일반적으로 코드를 짤 경우
!제네릭뷰(클래스형 뷰)를 쓰는 경우
|-
|-
|view 작성
|view 작성
|전체 글을 본다.<syntaxhighlight lang="python">
|전체 글을 본다.<syntaxhighlight lang="python">
from django.shortcuts import render
from .models import * #모델을 불러온다.
from .models import * #모델을 불러온다.


66번째 줄: 80번째 줄:
     context={'question_list':question_list, } #템플릿으로 보내줄 내용을 담는다.
     context={'question_list':question_list, } #템플릿으로 보내줄 내용을 담는다.
     return render(request, 'list.html', context) #list.html로 보낸다.
     return render(request, 'list.html', context) #list.html로 보낸다.
</syntaxhighlight>
|전체 글을 본다.<syntaxhighlight lang="python">
from django.views import generic
from .models import Question
class ListView(generic.ListView):
    def get_queryset(self):
        return Question.objects.order_by('-create_date')
#템플릿 명이 명시적으로 지정되지 않은 경우에는 자동으로 모델명_list.html을 템플릿명으로 사용.
</syntaxhighlight>
</syntaxhighlight>
|-
|-
76번째 줄: 100번째 줄:
     <ul>
     <ul>
         {% for question in question_list %}
         {% for question in question_list %}
         <li><a href="/question/{{question.id}}/">{{question.subject}}</a></li>
         <li><a href="{% url 'pool:detail' question.id %}">{{question.subject}}</a></li>
         {% endfor %}
         {% endfor %}
     </ul>
     </ul>
{% else %}
{% else %}
{% endif %}
{% endif %}
</syntaxhighlight>
|템플릿 명이 명시적으로 지정되지 않은 경우에는 자동으로 모델명_list.html을 템플릿명으로 사용.
/앱이름/template/question_list.html 을 좌측과 같이 짜주면 된다.<syntaxhighlight lang="python">
#따로 탬플릿 명을 명시하려면 다음의 변수를 get_queryset함수 안에 넣는다.
        template='앱이름/list.html'
</syntaxhighlight>탬플릿에 전달되는 리스트는 question_list라는 이름이었는데, 전달할 이름을 바꾸려면 다음과 같이 넣어준다.<syntaxhighlight lang="python">
#탬플릿에 전달될 리스트 이름을 바꾸려면 get_queryset함수 안에 이 변수를 넣는다.
    context_object_name='바꿀리스트명'
</syntaxhighlight>
</syntaxhighlight>
|}
|}


== 글 보기 ==
리스트에서 글을 클릭하면 글의 상세내용을 볼 수 있어야 한다.
{| class="wikitable"
{| class="wikitable"
!
!
|-
|-
|view 작성
|전체 글을 본다.<syntaxhighlight lang="python">
|전체 글을 본다.<syntaxhighlight lang="python">
from django.shortcuts import render
from .models import * #모델을 불러온다.
from .models import * #모델을 불러온다.


98번째 줄: 126번째 줄:
     context={'question_list':question_list, } #템플릿으로 보내줄 내용을 담는다.
     context={'question_list':question_list, } #템플릿으로 보내줄 내용을 담는다.
     return render(request, 'list.html', context) #list.html로 보낸다.
     return render(request, 'list.html', context) #list.html로 보낸다.
</syntaxhighlight>
|}
==글 보기==
리스트에서 글을 클릭하면 글의 상세내용을 볼 수 있어야 한다.
{| class="wikitable"
!
!일반적으로 코드를 짤 경우
!제네릭뷰(클래스형 뷰)를 쓰는 경우
|-
|view 작성
|글 하나의 내용을 본다.
get_object_or_404를 쓴다. id에 해당하는 객체가 없으면 서버에서 에러를 일으키는데, 이는 서버에러로 잡힌다.
에러의 방향성을 명확히 지정해주기 위해. 404에러를 부르게끔!<syntaxhighlight lang="python">
from django.shortcuts import render, get_object_or_404
from .models import * #모델을 불러온다.
def detail(request,question_id):#url에서 매핑된 question_id가 전달된다.
    question=get_object_or_404(Question, pk=question_id)
    context={'question':question}
    return render(request, 'detail.html', context)
</syntaxhighlight>
|<syntaxhighlight lang="python">
class DetailView(generic.DetailView):
    model = Question
#템플릿 명이 명시적으로 지정되지 않은 경우에는 자동으로 모델명_detail.html을 템플릿명으로 사용
</syntaxhighlight>
</syntaxhighlight>
|-
|-
|template작성
|template작성
|경로에 맞게 해주면 되는데, 위 뷰의 경우엔 /앱이름/template/list.html 에 만들어준다.
|경로에 맞게 해주면 되는데, 위 뷰의 경우엔 /앱이름/template/detail.html 에 만들어준다.
만들어진 html파일의 body에 다음과 같이 넣어준다.
만들어진 html파일의 body에 다음과 같이 넣어준다.


상황에 맞게 표를 만들든, 목차를 만들든 html을 짜면 될 터.<syntaxhighlight lang="html">
상황에 맞게 표를 만들든, 목차를 만들든 html을 짜면 될 터.
{% if question_list %}
 
    <ul>
<nowiki>{{변수.속성}}</nowiki> 형태로 필요한 데이터를 가져온다.<syntaxhighlight lang="html">
        {% for question in question_list %}
<h1>{{ question.subject }}</h1>
        <li><a href="/question/{{question.id}}/">{{question.subject}}</a></li>
<div>
        {% endfor %}
    {{ question.content }}
    </ul>
</div>
{% else %}
{% endif %}
</syntaxhighlight>
</syntaxhighlight>
|
|}
|}
== 글 작성 ==
==뷰 작성==
==뷰 작성==
뷰가 많아지면 /앱/views/posting_view.py 따위의 이름으로 작성한다.
뷰가 많아지면 /앱/views/posting_view.py 따위의 이름으로 작성한다.

2020년 10월 31일 (토) 19:51 판

장고! 웹 프레임워크! 틀:장고

  1. 장고:개요
  2. 장고:웹페이지설계
    1. 장고:앱
    2. 장고:url
    3. 장고:model
      1. 장고:DB
      2. 장고:모델 필드
      3. 장고:모델의 변경
    4. 장고:view
      1. 장고:클래스형 뷰, 제네릭 뷰
      2. 장고:view 각종 기능
    5. 장고:template
    6. 장고:static. 정적파일 사용하기
      1. 장고:CSS 사용하기
      2. 장고:JS 사용하기
      3. 장고:글꼴 사용
      4. 장고:부트스트랩
    7. 장고:media. 미디어 파일 사용하기
  3. 장고:관리자페이지
  4. 장고:settings.py
  5. 장고:기능구현
    1. 장고:회원관리
    2. 장고:유저
    3. 장고:커스텀 유저
    4. 장고:소셜로그인
    5. 장고:입력받기
    6. 장고:저장된 내용 활용하기
    7. 장고:변수 내보내기
    8. 장고:글쓰기
    9. 장고:페이징(페이지나누기)
    10. 장고:답변쓰기(댓글쓰기)
    11. 장고:추천,즐겨찾기
    12. 장고:새글(최신글) 나타내기
    13. 장고:썸머노트 설치
    14. 장고:네비게이션 바 만들기
    15. 장고:검색기능
    16. 장고:카테고리 만들기
    17. 장고:사진 올리기
    18. 장고:파일 업로드
    19. 장고:이메일app 만들기
    20. 장고:매직 그리드
  6. 장고:웹서비스
    1. 장고:Git
    2. 장고:리눅스에 올리기
    3. 장고:우분투에 올리기(nginx 사용)
    4. 장고:도커로 올리기
  7. 장고:팁

개요

글쓰기 기능을 구현하기 위해 정리한 문서.

기본적으로 포스팅 기능이지만, 모델명을 Post로 하기엔 전송방식인 post와 혼동이 오곤 해서 question으로 구현한다.

url 작성

urls.py 안에 필요한 기능을 다 담아주어야 한다.

예컨대, 글을 쓴다면 만들기, 편집, 삭제기능을 만들어주어야 하기에 다음과 같이 기입한다.

(뷰의 설정이나, import방식에 따라 뷰를 불러오는 방식이 달라질 수 있다.)

일반적으로 코드를 짜는 경우 제네릭 뷰를 사용하는 경우
from django.urls import path
from . views #해당 앱의 뷰를 불러온다.

app_name = 'pool'

urlpatterns = [
    path('question/', views.list, name='list'),#글의 리스트롤 보여주는 화면.
    path('question/detail/<int:question_id>/', views.detail, name='detail'),#글의 내용을 보여주는 화면.
    path('question/create/<int:question_id>/', views.create, name='create'),#글의 작성화면
    path('question/modify/<int:question_id>/', views.modify, name='modify'),#글의 수정화면
    path('question/delete/<int:question_id>/', views.delete, name='delete'),#글의 삭제화면
]
함수명을 바꾸어주어야 한다.

views.클래스뷰명.as_view()), 형태로.

클래스형 뷰임을 지정해주기 위해.

#아직 함수를 짜주진 않았지만, 앞으로 만들 함수에 대해 연결해두자.

모델 작성

글에서 포함해야 할 것들이 있다. 작성자, 작성일자, 내용 등의 요소를 포함하여 모델을 작성한다.

/앱/models.py 안에 작성한다.

from django.contrib.auth.models import User
from django.db import models

class Question(models.Model):#세부내용은 필요에 따라..
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_question')
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()
    modify_date = models.DateTimeField(null=True, blank=True)

    def __str__(self):#관리자페이지에 나타낼 객체 이름.
        return self.subject#이 객체의 subject를 이름으로 쓰겠다는 의미.

관리자 기능에서 확인

모델이 제대로 작성되고, 글이 제대로 생성될 수 있는지 관리자기능에 등록한 후 작성해보자.

관리자 등록은 장고:관리자페이지 참조.

이상이 없으면 뷰 작성으로 넘어가자.

뷰 작성

리스트 보기

일반적으로 코드를 짤 경우 제네릭뷰(클래스형 뷰)를 쓰는 경우
view 작성 전체 글을 본다.
from django.shortcuts import render
from .models import * #모델을 불러온다.

def list(request):
    question_list=Question.objects.order_by('-create_date') #만들어진 순서의 역순으로 정렬
    context={'question_list':question_list, } #템플릿으로 보내줄 내용을 담는다.
    return render(request, 'list.html', context) #list.html로 보낸다.
전체 글을 본다.
from django.views import generic
from .models import Question

class ListView(generic.ListView):
    def get_queryset(self):
        return Question.objects.order_by('-create_date')
#템플릿 명이 명시적으로 지정되지 않은 경우에는 자동으로 모델명_list.html을 템플릿명으로 사용.
template작성 경로에 맞게 해주면 되는데, 위 뷰의 경우엔 /앱이름/template/list.html 에 만들어준다.

만들어진 html파일의 body에 다음과 같이 넣어준다.

상황에 맞게 표를 만들든, 목차를 만들든 html을 짜면 될 터.
{% if question_list %}
    <ul>
        {% for question in question_list %}
        <li><a href="{% url 'pool:detail' question.id %}">{{question.subject}}</a></li>
        {% endfor %}
    </ul>
{% else %}
{% endif %}
템플릿 명이 명시적으로 지정되지 않은 경우에는 자동으로 모델명_list.html을 템플릿명으로 사용. /앱이름/template/question_list.html 을 좌측과 같이 짜주면 된다.
#따로 탬플릿 명을 명시하려면 다음의 변수를 get_queryset함수 안에 넣는다.
        template='앱이름/list.html'
탬플릿에 전달되는 리스트는 question_list라는 이름이었는데, 전달할 이름을 바꾸려면 다음과 같이 넣어준다.
#탬플릿에 전달될 리스트 이름을 바꾸려면 get_queryset함수 안에 이 변수를 넣는다.
    context_object_name='바꿀리스트명'
전체 글을 본다.
from django.shortcuts import render
from .models import * #모델을 불러온다.

def list(request):
    question_list=Question.objects.order_by('-create_date') #만들어진 순서의 역순으로 정렬
    context={'question_list':question_list, } #템플릿으로 보내줄 내용을 담는다.
    return render(request, 'list.html', context) #list.html로 보낸다.

글 보기

리스트에서 글을 클릭하면 글의 상세내용을 볼 수 있어야 한다.

일반적으로 코드를 짤 경우 제네릭뷰(클래스형 뷰)를 쓰는 경우
view 작성 글 하나의 내용을 본다.

get_object_or_404를 쓴다. id에 해당하는 객체가 없으면 서버에서 에러를 일으키는데, 이는 서버에러로 잡힌다.

에러의 방향성을 명확히 지정해주기 위해. 404에러를 부르게끔!
from django.shortcuts import render, get_object_or_404
from .models import * #모델을 불러온다.

def detail(request,question_id):#url에서 매핑된 question_id가 전달된다.
    question=get_object_or_404(Question, pk=question_id)
    context={'question':question}
    return render(request, 'detail.html', context)
class DetailView(generic.DetailView):
    model = Question
#템플릿 명이 명시적으로 지정되지 않은 경우에는 자동으로 모델명_detail.html을 템플릿명으로 사용
template작성 경로에 맞게 해주면 되는데, 위 뷰의 경우엔 /앱이름/template/detail.html 에 만들어준다.

만들어진 html파일의 body에 다음과 같이 넣어준다.

상황에 맞게 표를 만들든, 목차를 만들든 html을 짜면 될 터.

{{변수.속성}} 형태로 필요한 데이터를 가져온다.
<h1>{{ question.subject }}</h1>
<div>
    {{ question.content }}
</div>

글 작성

뷰 작성

뷰가 많아지면 /앱/views/posting_view.py 따위의 이름으로 작성한다.

글작성
from django.contrib.auth.decorators import login_required #로그인 기능
from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone

from ..forms import QuestionForm #폼을 불러온다.
from ..models import Question #모델을 불러온다.


@login_required(login_url='common:login')#로그인이 필요없으면 빼도 됨.
def create(request):
    if request.method == 'POST':#포스트로 요청이 들어온다면... 글을 올리는 기능.
        form = QuestionForm(request.POST) #폼을 불러와 내용입력을 받는다.
        if form.is_valid():
            question = form.save(commit=False)
            question.author = request.user  # 추가한 속성 author 적용
            question.create_date = timezone.now()
            question.save()
            return redirect('pybo:index') #작성이 끝나면 목록화면으로 보낸다.
    else:#포스트 요청이 아니라면.. form으로 넘겨 내용을 작성하게 한다.
        form = QuestionForm()
    context = {'form': form}
    return render(request, 'pybo/question_form.html', context)
글수정
from django.contrib import messages