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

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동
46번째 줄: 46번째 줄:
|-
|-
|(User, on_delete=models.CASCADE, related_name='author_question')
|(User, on_delete=models.CASCADE, related_name='author_question')
|
|on_delete=models.CASCADE 는 외래모델을 지우면 함께 지운다는 의미.
|-
|-
|subject = models.CharField(max_length=200)
|subject = models.CharField(max_length=200)
88번째 줄: 88번째 줄:
|시간담기
|시간담기
|
|
|-
|models.ForeignKey
|외래키를 사용함
|속성=models.ForeignKey('외래모델')
on_delete= 옵션이 필수로 지정되어야 함.
|-
|
|
|
|}
=== 테이블 관계를 나타내는 필드 ===
{| class="wikitable"
!내용
!설명
!옵션
|-
|models.ForeignKey
|외래키를 사용함. N:1 연결
|속성=models.ForeignKey('외래모델')
|-
|modles.ManyToManyField
|N:N연결
|속성=modles.ManyToManyField('외래모델')
|}
|}
이외 내용은 장고 공식 메뉴얼의 필드 레퍼런스를 참조. https://docs.djangoproject.com/en/3.1/ref/models/fields/#db-index
이외 내용은 장고 공식 메뉴얼의 필드 레퍼런스를 참조. https://docs.djangoproject.com/en/3.1/ref/models/fields/#db-index

2020년 9월 21일 (월) 22:47 판

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

  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 안에 필요한 기능을 다 담아주어야 한다.

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

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

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

    path('question/delete/<int:question_id>/', question_views.question_delete, name='question_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_question') 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.ForeignKey 외래키를 사용함. N:1 연결 속성=models.ForeignKey('외래모델')
modles.ManyToManyField N:N연결 속성=modles.ManyToManyField('외래모델')

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

뷰 작성

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