이전 Signup에는 Default User를 사용함 이번 버젼은 User를 커스텀하겠음

 

 

결과적으로 이것만 추가됨

 

from django import forms
drom django.contrib.auth.forms. import UserCreationForm
from django.contrib.auth import get_user_model # user 정보 알아서 빼주는 함수

# models.py 에서 Foreignkry가 user 일때만 세팅스.어스_유저_모델
# accounts/urls.py
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    mbti = models.CharField(max_length=4)
    # 아무값 채워넣으면 됨
    # 아무값 채워넣으면 됨



# Settings 맨밑에다 이거 추가
AUTH_USER_MODEL = 'accounts.User'

 

https://docs.djangoproject.com/en/4.1/topics/auth/default/ 

 

 

 

 

 

 

1:N 관계

User-table 하나에서 여러개의 Question-table, 여러개의 reply-table 생성가능

User-table : Question-table = 1 : N

User-table : reply-table.      = 1 : N

 

Question-table : reply-table = 1:N

 

 

<User-table>

id(seq) username password mb

  ti
1 홍길동 1234  
2 민수 123  
3 민아 1234  

<Question-table>

id(seq) Question user_id
1 오늘의 메뉴는? 1
2 오늘 날씨는? 2
3 내일 뭐하지? 3

<reply-table>

id 내용 Que_id user_id
1 햄버거 1(오늘메뉴는?) 3 (민아)
2 맑음 2 1 (홍길동

 

 

 

 

 

 

https://itcreator.tistory.com/129

이어서 하기

 

이전버전은 USER는 DB를 만들지 않아도 따로 생성되었음 (물론 커스터마이징 가능하지만 그건 나중에)

이번은 이전설정과 거의 비슷하게 한번 더 앱을 만들어 보고 게시판/댓글 DB 까지 다뤄보기

 

1.  기초설계

1. ctrl + shift + ~ 터미널 창 열어주기

2. board 앱 폴더 생성 및 등록

# root 기준  터미널 명령어

python manage.py startapp <app 이름>

mkdir -p <app 이름>/templates/<app 이름>  # 템플릿 생성

cd  <app 이름>/templates/<app 이름>  # 최하단 까지 이동

touch detail.html form.html index.html

#detail 게시판글 자세히보기  
#form 게시판 작성 폼
#index 게시글 리스트

 

3. urls.py 및 forms.py 생성

# 다시 최상단 으로 돌아와서( 보통 cd .. 3번 하면됨)

Touch <app이름>/urls.py    # (..../<app이름> 으로 들어오는 통로 열어주기)

Touch <app이름>/forms.py   

# Form 이 친구는 왜만드는거임?
   # 1. 유효성 체크 (validation check)
   # 2. HTML 안에 인풋태그 만들기 귀찮 
   # 3. 저장할 때 request.POST에서 일일이 꺼내기 귀찮아서
   # 이런 작업을 Form 하게 만들려고 미리 폴더 생성

 

2.  board  > urls.py 세팅해주기    (앱이름을 board 로 할 경우)

from django.urls import path
from . import views

app_name = 'board'
urlpatterns = [
    # articles/create/
    path('create/', views.create_article, name='create_article'),    # url에 articles/create/으로 접근이 온다면 => views 에 있는 create_article 함수 실행 / 그리고 이 과정을 create_article 이 라고 칭하겠다. 
    # articles/
    path('', views.article_index, name='article_index'),
    # articles/1/
    path('<int:article_pk>/', views.article_detail, name='article_detail'),
    # articles/1/update/
    path('<int:article_pk>/update/', views.update_article, name='update_article'),
    # articles/1/delete/
    path('<int:article_pk>/delete/', views.delete_article, name='delete_article'),

 

 

3. Model 단 (board > models.py)

from django.db import models
from django.conf import settings

class Article(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) # settings.AUTH_USER_MODEL 파이썬이 이렇게 써달래
    title = models.CharField(max_length=100)									# on_delete=models.CASCADE 이게 지워지면 안에 다른것도 다 지워달라 
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Comment(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    content = models.CharField(max_length=200)
    # foreign key 쓰면 필드명에 _id 붙이지 않기.
    # migrate 하면 알아서 뒤에 _id가 붙음
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    Created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

 

3-1 . Form 단 (board > forms.py)

from django import forms
from .models import Article, Comment
class ArticleForm(forms.ModelForm):
    
    class Meta:
        model = Article
        #fields= '__all__'
        exclude = ('user',) # user는 Article의 FK라 article테이블의 user의 키가 
        					# User테이블의 pk값이 없는걸 넣을려고 하면 DB에서 막음 (무결성)
       
class CommentForm(forms.ModelForm):
    content = forms.CharField(min_length=2, max_length=200,
    widget=forms.TextInput(attrs={'autofocus': True})
    )
    class Meta:
        model = Comment
        # fields = ('content',)
        exclude = ('article', 'user')

model. form 끝냈으면 마이그레이트 시작

python manage.py makemigrations board

python manage.py migrate board

 

 

4. Control 단 (board > views.py)

1. 쉬운 버전용 필요한 클래스 import 하기

# 화면구성, 화면이동, 객체를 받거나 없으면 404에러를 터트려줌 (이거 없으면 서버 문제가 아닌데도 500 서버단 에러를 터트림)
from django.shortcuts import render, redirect, get_object_or_404

# get, post등 url 접근 방식에 따라 분류해서 허용하겠다
from django.views.decorators.http import (require_http_methods, require_POST, require_safe, )

# 로그인 상태에만 해당 함수 실행가능
from django.contrib.auth.decorators import login_required

# DB 불러오기
from .models import Article, Comment

# 앞서 만듬 form 불러오기
from .forms import ArticleForm, CommentForm

 

2. create_article 작성

@login_required  # 로그인이 되어야 이 작업가능
@require_http_methods(['GET', 'POST'])  # GET, POST로 들어오는 경우
def create_article(request):   #request 요청 받은 정보 전부 인수로 전달한뒤 함수 실행
    
    if request.method == 'POST': # POST라면(게시글 등록버튼 누를때)
        form = ArticleForm(request.POST) # POST로 쏘는 내용물 채워서 form에 저장
        if form.is_valid():  # 값이 유효하다면
            article = form.save(commit=False) # 잠깐 저장은 하지말아봐  # article부터 만들어야하는데 save를 하면 오류터짐
            article.user = request.user  # 페이징 요청자의 정보를 글작성자의 정보로 넣어줌
            article.save()  # 게시글 저장(내장함수)
            return redirect('board:article_detail', article.pk)   # 글번호와 함께 detail() 함수실행

    else:   # GET으로 왔다면(페이지를 요청할때)
        
        form = ArticleForm()   # form.py에서 만든걸 form으로
    context = {'form': form }    # context에 담아서 
   
    return render(request, 'board/form.html', context)  # form.html로 넘겨줌

 

3. read

@require_safe # get, head 요청만 허용하겠다.
def article_index(request):
    articles = Article.objects.all()   # DB의 article의 모든 값을 articles에 넣어줌
    context = {'articles': articles, }   # 그걸 context에 담아서
    return render(request, 'board/index.html', context)   # index.html로 넘겨줌

@require_safe
def article_detail(request, article_pk):   # 몇번째 게시글인지 알 수 있게 article_pk 받아야함
    article = get_object_or_404(Article, pk=article_pk)  # db에서 객체를 받던가 404를 띄워라! why? DB에 없는걸 요청한다면 니 잘못
    form = CommentForm() # 댓글보여줄려고-> detail.html에 board/_comment_form.html에 form 쓸려고
    context = {     # 게시글 정보와 댓글을 context에 담아서
        'article': article,
        'form': form
    }
    return render(request, 'board/detail.html', context)   # detail.html로 보냄

 

4. update

@login_required  # 로그인 필요
@require_http_methods(['GET', 'POST'])   # GET, POST로 오는 경우
def update_article(request, article_pk):
    article = get_object_or_404(Article, pk=article_pk)   # 받은 번호의 게시글 정보를 DB에서 찾아 article에 넣어줌
   
    if request.user != article.user:			 # 작성자 아니면
        return redirect('board:article_detail', article.pk)    # 게시글 번호와함께 detail.html로 보내버림

    if request.method == 'POST':   # POST인 경우(게시글 수정 버튼을 누를때)
        form = ArticleForm(request.POST, instance=article)  # instance=student 가 없으면 수정이 아니라 새 값으로 저장되어버림 + 이전정보 넣어주기
        if form.is_valid():  # form이 유효하다면
            # 기존에 저장된 user_id 갱신할 필요가 없기때문에 commit=False 필요 X
            article = form.save()   # 저장해서 article에 넣어주기
            return redirect('board:article_detail', article.pk)   # 게시글 번호 주면서 detail() 함수실행
    else:   # get방식이라면 (이 페이지를 요청할때)
        form = ArticleForm(instance=article)   # # instance=student => form에다가 이전 정보 넣기
    context = {'form': form}   # context에 담아서
    return render(request, 'board/form.html', context)   # form.html로 보냄

 

5. Delete

@login_required   # 로그인 필요
@require_POST   # POST인 경우(url로 들어오는거 막겠다/ 제출버튼으로 토큰 던지면서 와라)
def delete_article(request, article_pk):  # 요청받은 정보와 게시글 번호를 주면서
    article = get_object_or_404(Article, pk=article_pk)  # 번호에 맞는 Article DB에서 객체를 꺼내서 article에 주던가 404로 
    if request.user == article.user:   # 요청자와 글쓴이가 같다면 
        article.delete()   	# 게시글 삭제(내장함수) 
        return redirect('board:article_index')   # index로 보내주기
    else:     # 요청자와 글쓴이가 같지않다면
        return redirect('board:article_detail', article.pk)  # 게시글 번호와함께 detail.html로 보냄

 

6. 댓글 (간단하게 CRD만)

@require_POST
def create_comment(request, article_pk):  # 요청 정보와 게시글 번호를 받음
    form = CommentForm(request.POST) # 댓글 제출 버튼시 값들을 form에 넣어줌 
    article = get_object_or_404(Article, pk=article_pk) # 받은 번호의 게시글 정보를 DB에서 찾아 article에 넣어줌

    if form.is_valid():  # form이 유효하다면
       
        comment = form.save(commit=False)    # 완전 저장시 NOT NULL 에러 뜨니까, 직전에 멈춰 주세요.
        comment.article = article       # 여기선 알아서 값 넣어줌
        comment.user = article			 # 여기선 알아서 값 넣어줌
        comment.save()		# 값 저장(내장함수)
    return redirect('board:article_detail', article.pk)  # 게시글 번호 받아서 detail() 함수 실행 
    # comment.article.pk 게시글 번호임

@require_safe # get, head 요청만 허용하겠다.
def article_index(request):   # 요청한값 받음
    articles = Article.objects.all()  Article DB 값 받아서 articles에 넣어줌
    context = {'articles': articles, }   # 그 값을 context 넣고
    return render(request, 'board/index.html', context)  # index.html로 보내줌

@require_safe
def article_detail(request, article_pk):   # 요청정보와 게시글 번호 받음
    article = get_object_or_404(Article, pk=article_pk)  # 받은 번호의 게시글 정보를 DB에서 찾아 article에 넣어줌
    form = CommentForm() # 댓글보여줄려고-> detail.html에 board/_comment_form.html에 form 쓸려고
    context = {
        'article': article,
        'form': form
    }
    return render(request, 'board/detail.html', context)


@login_required
@require_POST
def delete_comment(request, article_pk, comment_pk):
    comment = get_object_or_404(Comment, pk=comment_pk)
    article = get_object_or_404(Article, pk=article_pk) # article.pk 를 쓰기위해서 만듬
    
    if request.user == comment.user:
        comment.delete()
    return redirect('board:article_detail', article.pk)
    
    # article_pk 안쓰는 이유는 사용자를 믿을수없어서.
    # 사용자가 보낸거 _pk 구분한다음  내부적으로 확인해서 믿을하면 .pk 써도 무방

 

 

총정리

@login_required
@require_http_methods(['GET', 'POST'])
def create_article(request):
    
    if request.method == 'POST': 
        form = ArticleForm(request.POST) 
        if form.is_valid():
            article = form.save(commit=False)
            article.user = request.user 
            article.save()
            return redirect('board:article_detail', article.pk)

    else: 
        form = ArticleForm()
    context = {'form': form }
    return render(request, 'board/form.html', context)

@login_required
@require_http_methods(['GET', 'POST'])
def update_article(request, article_pk):
    article = get_object_or_404(Article, pk=article_pk)
    
    if request.user != article.user:
        return redirect('board:article_detail', article.pk)

    if request.method == 'POST':
        form = ArticleForm(request.POST, instance=article)        
        if form.is_valid():
           
            article = form.save()
            return redirect('board:article_detail', article.pk)
    else:
        form = ArticleForm(instance=article)
    context = {'form': form}
    return render(request, 'board/form.html', context)

@login_required
@require_POST
def delete_article(request, article_pk):
    article = get_object_or_404(Article, pk=article_pk)
    if request.user == article.user:
        article.delete()
        return redirect('board:article_index')
    else:
        return redirect('board:article_detail', article.pk)



@require_POST
def create_comment(request, article_pk):
    form = CommentForm(request.POST)
    article = get_object_or_404(Article, pk=article_pk)

    if form.is_valid():
      
        comment = form.save(commit=False) 
       
        comment.article = article
        comment.user = article
        comment.save()
    return redirect('board:article_detail', article.pk)
  

@require_safe 
def article_index(request):
    articles = Article.objects.all()
    context = {'articles': articles, }
    return render(request, 'board/index.html', context)

@require_safe
def article_detail(request, article_pk):
    article = get_object_or_404(Article, pk=article_pk)
    form = CommentForm() 
    context = {
        'article': article,
        'form': form
    }
    return render(request, 'board/detail.html', context)



@login_required
@require_POST
def delete_comment(request, article_pk, comment_pk):
    comment = get_object_or_404(Comment, pk=comment_pk)
    article = get_object_or_404(Article, pk=article_pk)
    
    if request.user == comment.user:
        comment.delete()
    return redirect('board:article_detail', article.pk)

 

 https://itcreator.tistory.com/125 를 보고 이 글을 진행하는게 이해가 쉬움 

 

시작하기전에 협업할때 편한 가상화 작업

 

1. ctrl + shift + ~ 터미널 창 열어주고 가상환경설정하기

 

python -m venv <env name> # 가상환경
# Venv 안뜨면 ctrl/command + shift + p 로 인터프리터 열어서 <env이름> 직접 선택

# 수동
(Mac) source venv/bin/activate
(Win) source vent/Scripts/activate
pip install django==3.2.16 django_extensions

pip list  # 상태확인

touch README.md .gitignore # READ, gitignore 사전작업

pip freeze > requirements.txt  # 협업 세팅환경용


# 3.2.16버전이 롱텀이라 안전성높음

 

 

1. 회원가입에 필요한 기초설계

1. account 앱 폴더 생성 및 등록

# root 기준  터미널 명령어

python manage.py startapp <app 이름>

mkdir -p account/templates/account  # 템플릿 생성

cd  account/templates/account  # 최하단 까지 이동

touch login.html signup.html     # html 생성

 

2. urls.py 생성 (..../<app이름> 으로 들어오는 통로 열어주기)

# 다시 최상단 으로 돌아와서( 보통 cd .. 3번 하면됨)

Touch <app이름>/urls.py    # url 이동 잡아주기

 

2.  accounts  > urls.py 세팅해주기    (앱이름을 accounts로 할 경우)

from django.urls import path
from . import views

app_name = 'accounts'

urlpatterns = [
    # accounts/signup/
    path('signup/', views.signup, name='signup'),   # url에 accounts/signup/으로 접근이 온다면 => views 에 있는 signup 함수 실행 / 그리고 이 과정을 signup 이 라고 칭하겠다. 
    # accounts/login/
    path('login/', views.login, name='login'),
    # accounts/logout/
    path('logout/', views.logout, name='logout'),

]

 

3. Control 단 (accounts > Views.py)

1. 쉬운 버전용 필요한 클래스 import 하기

# 화면구성, 화면이동, 객체를 받거나 없으면 404에러를 터트려줌 (이거 없으면 서버 문제가 아닌데도 500 서버단 에러를 터트림)
from django.shortcuts import render, redirect, get_object_or_404 

# DB 생성없이도 account에 필요한 컬럼을 만들어줌, 인증에 필요한 옵션
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

# 세션을 부여하거나 수거함 (출입증)
from django.contrib.auth import login as auth_login, logout as auth_logout

# get, post에 따른 
from django.views.decorators.http import require_http_methods

 

2. 가장 먼저 signup 함수채우기 

@require_http_methods(['GET', 'POST'])   #GET, POST 요청만 받겠다
def signup(request):   #request 요청 받은 정보 전부 인수로 전달한뒤 함수 실행
    if request.method == 'POST':  # 회원가입 신청서 제출시 작동
        form = UserCreationForm(request.POST)  # user 의 경우 Model괴 Form도 자동으로 해줌 /import만 잘하면됨
        if form.is_valid():   # 내장 검증함수실행 / False 시 13번부터 실행
            user = form.save()   # 유저가 입력한 정보 DB에 저장
            auth_login(request, user) # 회원가입하고 바로 세션부여 채워줌 
            return redirect('board:article_index')   # 바로 게시글 볼 수 있게 리다이렉트해줌
    
    else:   # get으로 온 경우 
        form = UserCreationForm()   # 회원가입 폼
        
    context = {'form': form }  # 폼을 context에 담아서 
    return render(request, 'accounts/signup.html', context)   #받은 정보들을 바탕으로 signup.HTML 화면 구성

3. login 함수 채우기

@require_http_methods(['GET', 'POST'])  # get과 포스트만 받겠다
def login(request):
    if request.method == 'POST':  # POST인 상황 즉 아이디 / 비번 넣고 로그인 버튼 눌렀을때 실행
        form = AuthenticationForm(request, request.POST) # 인증폼은 다른 폼과 인자 구성이 다름 / 지금은 request 인수를 던지는 이유에 대해선 넘어가기로.. 
        if form.is_valid():
            user = form.get_user()  # 이 유저가 누군지 알려줌
            auth_login(request, user ) # 받은 유저정보를 주면 입장 팔찌를 채워줌 파이썬에서 제공해주는 함수 (임포트해야함) 
           #  None/ URL string 들어가있음
            next = request.GET.get('next') # 다른곳에서 튕겨서 온 사람들 /? 이후 URL을 request.GET으로 받음 .get은 값이 없더라도 none으로 받음  
            return redirect(next or 'board:article_index') # next 가 false 면 index로 보내고/ next가 true 면 next 값으로 이동  
    else:  #  GET인 상황 로그인 페이지를 들어오는 상태라면
        form = AuthenticationForm()   # 내장함수를 form으로 받고
    context = {'form': form}   # 내장함수에 받은 내용을 context에 담아 보냄
    return render(request, 'accounts/login.html', context)

4. logout 함수채우기

def logout(request):
    auth_logout(request) # 세션을 지움
    return redirect('board:article_index')  # 게시글 있는곳으로 다시 리다이렉트

 

 

 

 

< 총 정리하자면 >

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.views.decorators.http import require_http_methods

@require_http_methods(['GET', 'POST'])
def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)  
        if form.is_valid():
            user = form.save()
            auth_login(request, user) 
            return redirect('board:article_index')
    else:
        form = UserCreationForm()

    context = {'form': form }
    return render(request, 'accounts/signup.html', context)


@require_http_methods(['GET', 'POST'])
def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST) 
        if form.is_valid():
            user = form.get_user()  
            auth_login(request, user ) 
           
            next = request.GET.get('next')
            return redirect(next or 'board:article_index') 
    else:
        form = AuthenticationForm()
    context = {'form': form}
    return render(request, 'accounts/login.html', context)

def logout(request):
    auth_logout(request)
    return redirect('board:article_index')

 

 

https://itcreator.tistory.com/130

2탄 게시판 및 댓글 쉬운버젼 (DB가 추가됨)

 

[Django] Board/comment 게시판/댓글 쉬운버젼

https://itcreator.tistory.com/129 이어서 하기 이전버전은 USER는 DB를 만들지 않아도 따로 생성되었음 (물론 커스터마이징 가능하지만 그건 나중에) 이번은 이전설정과 거의 비슷하게 한번 더 앱을 만들

itcreator.tistory.com

 

1.  Project 폴더 / 앱 설정

 

1. 프로젝트 폴더 생성 과 동시에 manage.py 파일을 만듬.

django-admin startproject  <project 이름> . (뒤에 . 찍어야 현재 폴더 위치에서 생성됨)

2. 그 프로젝트 안에 구성할 앱들 만들기

python manage.py startapp <app 이름>

 

 

2.  가상환경 설정 

메인폴더에서 

python -m venv <env name> # 가상환경



(Mac) source venv/bin/activate

(Win) source vent/Scripts/activate

 

Command + Shift + p > 인터프리터 선택 > 가상환경 선택

venv 가 안떠있으면 터미널 껏다 켜기

READ.md , .gitignore, requirements 생성

pip install django==3.2.16 django_extensions

pip list  # 상태확인

touch README.md .gitignore # READ, gitignore 사전작업

pip freeze > requirements.txt  # 협업 세팅환경용


# 3.2.16버전이 롱텀이라 안전성높음

 

 

3. 뼈대잡기 

사용할 html의 뼈대를 잡음

 

1. 공통적으로 활용할 html 생성

Project > templates > base.html or navbar.html 등등 (include용 메인 html)

install -Dv /dev/null template/base.html

#   (mkdir templates >  touch templates/base.html을 한번에)

 

2. 앱에서 사용할 html 생성

Mkdir -p <app이름>/templates/<app이름>  # -p 는 templates 라는 상위폴더가 없어도 상위폴더까지 같이 생성해줌

cd <app이름>/templates/<app이름>  # cd로 최하단까지이동

touch **.html **2.html **3.html (사용할 html 쭉 나열하면 여러개 생성)

 

 

 

3. 기타 .py 파일 생성

# 다시 최상단 으로 돌아와서( 보통 cd .. 3번 하면됨)

Touch <app이름>/urls.py, forms.py 생성

4. 초기세팅

1. Project>settings에서 해야할 일

 Project > settings > app등록  

*

'django_extensions', # 추가해두면 나중에 python manage.py shell_plus 사용가능

 

 

 

 

 

 

Templates / dirs 등록 >  BASE_DIR / ‘templates’

 

 

(Project) > (App) > views.py > 함수생성

 

base.html > block > tab

 

2. Master urls.py 내용추가

from django.contrib import admin
from django.urls import path, include

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

 

3. app이름 >  urls.py

from django.urls import path
from . import views

app_name = '<앱이름>'

urlpatterns = [
    # <앱이름>/create/
    path('create/', views.create, name='create'),
    # <앱이름>/
    path('', views.index, name='index'),
    # <앱이름>/1/
    path('<int:student_pk>/', views.detail, name='detail'),
    # <앱이름>/1/update/
    path('<int:student_pk>/update/', views.update, name='update'),
    # <앱이름>/1/delete/
    path('<int:student_pk>/delete/', views.delete, name='delete'),
]

 

4. app이름 > views.py 세팅

함수정의 하기 

 

from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_http_methods, require_safe, require_POST
from .models import Student
from .forms import StudentForm

@require_http_methods(['GET', 'POST'])
def create(request):
    pass
    
# CRUD에 맞는 필요함수 적기

 

 

4. 서버실행

Manage.py 있는 루트위치에서

python manage.py runserver 

# 나가기 Ctrl + C

 

5. DB 세팅

1. Model.py 작성

app > models.py  / 자바로 치면 DAO

from django.db import models

class Student(models.Model):
    name = forms.CharField(min_length=2, max_length=10)
    title = forms.CharField(min_length=2, max_length=20)

 

2. Forms.py 작성

app > forms.py

# 1. 유효성 체크 (validation check)
# 2. HTML 안에 인풋태그 만들기 귀찮
# 3. 저장할 때 request.POST에서 일일이 꺼내기 귀찮아서 forms.py 만들어서 관리
from django import forms
from .models import Student

class StudentForm(forms.ModelForm):
    name = forms.CharField(min_length=2, max_length=10)
    title = forms.CharField(min_length=2, max_length=20)
    
    class Meta:  # 이 클래스의 메타 데이터 저장용 
        model = Student
        # fields = ('name', 'title')
        fields = '__all__'

 

3. 서버시작

서버실행 (혹시 값이 바뀔면 다시 실행)

python manage.py makemigrations <app이름>

python manage.py migrate <app이름>

# 잘안되면
rm db.sqlite3 <앱이름>/migrations/0*
rm db.sqlite3 accounts/migrations/0* board/migrations/0*  
# 다 지우고다시

 

 

6. 꾸미기

pip install django-bootstrap-v5

# 장고 부트스트랩 추가
pip install django-bootstrap-v5

설명서

https://django-bootstrap-v5.readthedocs.io/en/latest/installation.html

 

+ Recent posts