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

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동
4번째 줄: 4번째 줄:
글쓰기 기능을 구현하기 위해 정리한 문서.
글쓰기 기능을 구현하기 위해 정리한 문서.


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


==url 작성==
==url 작성==
11번째 줄: 11번째 줄:
예컨대, 글을 쓴다면 만들기, 편집, 삭제기능을 만들어주어야 하기에 다음과 같이 기입한다.
예컨대, 글을 쓴다면 만들기, 편집, 삭제기능을 만들어주어야 하기에 다음과 같이 기입한다.


    path('question/create/', question_views.question_create, name='question_create'),
    path('posting/create/', posting_views.posting_create, name='posting_create'),


    path('question/modify/<int:question_id>/', question_views.question_modify, name='question_modify'),
    path('posting/modify/<int:posting_id>/', posting_views.posting_modify, name='posting_modify'),


    path('question/delete/<int:question_id>/', question_views.question_delete, name='question_delete'),
    path('posting/delete/<int:posting_id>/', posting_views.posting_delete, name='posting_delete'),


<nowiki>#</nowiki>아직 함수를 짜주진 않았지만, 앞으로 만들 함수에 대해 연결해두자.
<nowiki>#</nowiki>아직 함수를 짜주진 않았지만, 앞으로 만들 함수에 대해 연결해두자.
45번째 줄: 45번째 줄:
|author속성을 외부의 객체를 불러온다는 의미.
|author속성을 외부의 객체를 불러온다는 의미.
|-
|-
|(User, on_delete=models.CASCADE, related_name='author_question')
|(User, on_delete=models.CASCADE, related_name='author_posting')
|on_delete=models.CASCADE 는 외래모델을 지우면 함께 지운다는 의미.
|on_delete=models.CASCADE 는 외래모델을 지우면 함께 지운다는 의미.
|-
|-
118번째 줄: 118번째 줄:


==뷰 작성==
==뷰 작성==
/앱/views/question_view.py 따위의 이름으로 작성한다.
/앱/views/posting_view.py 따위의 이름으로 작성한다.
{| class="wikitable"
{| class="wikitable"
|+
|+

2020년 10월 27일 (화) 14:28 판

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

  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와 혼동이 오곤 해서 posting으로 구현한다.

url 작성

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

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

    path('posting/create/', posting_views.posting_create, name='posting_create'),

    path('posting/modify/<int:posting_id>/', posting_views.posting_modify, name='posting_modify'),

    path('posting/delete/<int:posting_id>/', posting_views.posting_delete, name='posting_delete'),

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

모델 작성

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

/앱/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

설명

내용 설명
author = models.ForeignKey author속성을 외부의 객체를 불러온다는 의미.
(User, on_delete=models.CASCADE, related_name='author_posting') on_delete=models.CASCADE 는 외래모델을 지우면 함께 지운다는 의미.
subject = models.CharField(max_length=200) 제목은 200자까지 문자열로 받는다.
create_date = models.DateTimeField() 시간을 담는 공간이다.
modify_date = models.DateTimeField(null=True, blank=True) 수정시간을 담는다.

모든 필드에서 쓰는 옵션

null=True는 빈 값도 인정한다는 의미이다. 기본적으로 False.

자주 사용하는 필드

내용 설명 옵션
models.CharField 텍스트 필드.

(글자제한을 위해)

옵션 설명
max_length=숫자 해당숫자만큼 제한한다.
models.TextField 텍스트 필드.

(글자제한 없음)

models.DateTimeField 시간담기
models.ForeignKey 외래키를 사용함 속성=models.ForeignKey('외래모델')

on_delete= 옵션이 필수로 지정되어야 함.

연결된 키가 지워져도 유지되게 하려면 옵션에 models.PROTECT를 기입한다.

테이블 관계를 나타내는 필드

내용 설명 옵션
models.ForeignKey 외래키를 사용함. N:1 연결 속성=models.ForeignKey('외래모델')
modles.ManyToManyField N:N연결 속성=modles.ManyToManyField('외래모델')

이외 내용은 장고 공식 메뉴얼의 필드 레퍼런스를 참조. https://docs.djangoproject.com/en/3.1/ref/models/fields/#db-index

뷰 작성

/앱/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 question_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