๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง 2022.04.08.๊ธˆ

by DevIseo 2022. 4. 8.

Today I Learn 220408


์˜ค๋Š˜์€ Django CRUD๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ–ˆ๋‹ค. ์ด์ „์— ํ–ˆ๋˜๊ฒƒ์—์„œ develop๋œ ํ”„๋กœ์ ํŠธ์˜€๋‹ค. ๊ทธ ์ค‘ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์ด์ „์—๋Š” html์„ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•ด๋ƒˆ๋‹ค๋ฉด, ์ด๋ฒˆ์—๋Š” Django ModelForm์„ ํ™œ์šฉํ•˜์—ฌ ๋” ๊น”๋”ํ•œ ํ˜•ํƒœ๋ฅผ ์ถœ๋ ฅํ•ด๋ƒˆ๋‹ค. ๋˜ํ•œ bootstrap5๋ฅผ ํ™œ์šฉํ•ด ๋” ์™„์„ฑ๋„ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•ด ๋ƒˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋ ค์› ๋˜ ์ 

๋ช…์„ธ์„œ์— ์žˆ๋Š”๋Œ€๋กœ forms.py์˜ class์•ˆ์— ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š”๊ฒŒ ์‚ด์ง ๊นŒ๋‹ค๋กœ์› ๋‹ค. ์ด์ „์— ์‹ค์Šตํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ widget์„ ์‚ฌ์šฉํ•˜๋‹ˆ ์•ฝ๊ฐ„ ์–ด๋ ค์›€์ด ์ปธ์—ˆ๋‹ค.

from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = '__all__'

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ forms.py๋Š” ๊ตฌ์„ฑ๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์— widget์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

<Django์˜ ์œ„์ ฏ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€>

  1. ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•
from django import forms
from .models import Article

#application/forms.py๋ฅผ ์ถ”์ฒœํ•จ!

#Django์˜ ์œ„์ ฏ ์‚ฌ์šฉ ๊ถŒ์žฅ ์‚ฌํ•ญ
class ArticleForm(forms.ModelForm):
    title = forms.CharField(
        label="์ œ๋ชฉ",
        widget=forms.TextInput(
            attrs={
                'class':'my-title form-control',
                'placeholder':'์ž…๋ ฅํ•˜์„ธ์š”',
            }
        )
    )

    content = forms.CharField(
        label="๋‚ด์šฉ",
        widget=forms.Textarea(
            attrs={
                'class':'my-content form-control',
            }
        ),
        error_messages={
            'required':'Please enter your content!!!!'
        }
    )
    class Meta:
        model = Article
        fields = '__all__'

2. ๋ชจ๋ธ์— mappingํ•˜๋Š” ๋ฐฉ๋ฒ•

from django import forms
from .models import Article

#application/forms.py๋ฅผ ์ถ”์ฒœํ•จ!

#Django์˜ ์œ„์ ฏ ์‚ฌ์šฉ ๊ถŒ์žฅ ์‚ฌํ•ญ
class ArticleForm(forms.ModelForm):
    class Meta: #๋ชจ๋ธ์— mapping
        model = Article
        fields = '__all__'
        #exclude=('title',) #fields์™€ exclude๋Š” ๊ฐ™์ด ์‚ฌ์šฉ ๊ธˆ์ง€!
        widgets = {
             'title' : forms.TextInput(attrs={'placeholder': '์ž…๋ ฅํ•˜์„ธ์š”'})}

๋‚ด๊ฐ€ ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ ธ๋˜ select์š”์†Œ ๋„ฃ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

from django import forms
from .models import Article

class ArticleForm(forms.Form):
     REGION_A = 'sl'
     REGION_B = 'dj'
     REGION_C = 'gj'
     REGION_D = 'gm'
     REGION_E = 'bu'
     REGIONS_CHOICE = [
         (REGION_A,'์„œ์šธ'),
         (REGION_B,'๋Œ€์ „'),
         (REGION_C,'๊ด‘์ฃผ'),
         (REGION_D,'๊ตฌ๋ฏธ'),
         (REGION_E,'๋ถ€์šธ๊ฒฝ'),
     ]
     title = forms.CharField(max_length=10)
     content = forms.CharField(widget=forms.Textarea)
     region = forms.ChoiceField(widget=forms.Select,choices=REGIONS_CHOICE)

๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ ์–ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

from django import forms
from .models import Movie

class MovieForm(forms.ModelForm):

    GENRES_CHOICES = [
    ("์ฝ”๋ฏธ๋””", "์ฝ”๋ฏธ๋””"),
    ("๊ณตํฌ", "๊ณตํฌ"),
    ("๋กœ๋งจ์Šค", "๋กœ๋งจ์Šค")]
    genre = forms.ChoiceField(choices=GENRES_CHOICES, widget=forms.Select())
    score = forms.FloatField( widget=forms.NumberInput(attrs={'type':'number', 'step':0.5, 'min':0, 'max':5,}))

    release_date = forms.DateField(widget=forms.DateInput(attrs={'type':'date'}))

    class Meta:

        model = Movie
        fields = '__all__'

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šด ์ 

์ด์ „ ๊ด€ํ†ต์—์„œ๋Š” new์™€ edit์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋Š”๋ฐ ์ด๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ ธ์„œ ์ข‹์•˜๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๋Š”๋ฐ์—๋Š” ModelForm์˜ ์—ญํ• ๋„ ์ปธ๋‹ค.

์ด์ „์—htmlํŒŒ์ผ์— ํ•˜๋‚˜์”ฉ ๋‹ค ์“ธ๋•Œ๋งˆ๋‹ค ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋Š”๋ฐ, ModelForm์— bootstrap๊นŒ์ง€ ์ด์šฉํ•˜๋‹ˆ ์ฝ”๋“œ๋„ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ถœ๋ ฅ๋ฌผ๋„ ๊น”๋”ํ•˜์—ฌ ์ง€๋‚œ๋ฒˆ ๊ด€ํ†ต์˜ ๊ฒฐ๊ณผ๋ณด๋‹ค ํ™ˆํŽ˜์ด์ง€ ๋‹ค์šด ๋ชจ์Šต์œผ๋กœ ๋ฐœ์ „๋˜์—ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ๊ธฐ์–ตํ•  ์ !

  • bootstrap5๋ฅผ ์ด์šฉ์‹œ settings.py์— ์•ฑ ๋“ฑ๋ก์„ ํ•ด์ฃผ์–ด์•ผํ•˜๊ณ , htmlํŒŒ์ผ์—์„œ load๋ฅผ ํ†ตํ•ด bootstrap5๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผํ•œ๋‹ค!

์•ž์œผ๋กœ๋„ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ์ ๋Š” views.py

from django.shortcuts import render,redirect
from .models import Movie
from .forms import MovieForm

# Create your views here.

def index(request):
    movies = Movie.objects.order_by('-pk')
    context = {
        'movies':movies,
    }
    return render(request,'movies/index.html',context)


def create(request):
    if request.method == 'POST':
        form = MovieForm(request.POST)
        #create
        if form.is_valid():
            movie=form.save()
            return redirect('movies:detail',movie.pk)
    
    #new
    else:
        form = MovieForm()
    context = {
        'form' : form,
    }
    return render(request,'movies/create.html',context)

def detail(request,pk):
    movie = Movie.objects.get(pk=pk)
    context = {
        'movie' : movie,
    }
    return render(request,'movies/detail.html',context)

def delete(request,pk):
    movie = Movie.objects.get(pk=pk)
    if request.method == 'POST':
        movie.delete()
        return redirect('movies:index')
    else:
        return redirect('movies:detail',movie.pk)


def update(request,pk):
    movie = Movie.objects.get(pk=pk)
    #update
    if request.method == 'POST':
        form = MovieForm(request.POST,instance=movie)
        if form.is_valid():
            movie=form.save()
            return redirect('movies:detail', movie.pk)
    #edit
    else:
        form = MovieForm(instance=movie)
    context = {
        'movie': movie,
        'form': form,
    }
    return render(request, 'movies/update.html', context)

๋Œ“๊ธ€