Django #8 - Django Form

김엣취·2024년 8월 16일

Django

목록 보기
9/17

1. Form

Model 선언할 때와 비슷한 자태를 갖고있다.
form안에는 입력받고자 하는 데이터의 세부사항을 입력해주면 됨

from django import forms


class ArticleForm(forms.Form):
    title = forms.CharField(max_length=10)
    content = forms.CharField(widget=forms.Textarea)

rendering options

HTML엔 이렇게
as_p는 p로 감싸져서 나오게 해달라는 뜻. div도 가능함.
더 많은 방법들

views.py에서 이렇게 해줘야 HTML에서 변수로 사용할 수 있다.

Form Widget

웹 페이지에서 Form Input 요소가 어떻게 렌더링 되어서 보여질지 정의됨
더 많은 위젯

2. Model Form

Model을 참고해 Form을 알아서 만들도록 시킨다.
Model Form

from django import forms

from articles.models import Article


class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = "__all__"
        # exclude = ["title"]

3. Code Refactoring

3-1. new - create

new는 GET, create는 POST로 들어오니, 조건문(if else)를 잘 활용해보자

그리고

  • new view 함수 지우기
  • new url path 지우기
  • new.htmlcreate.html 로 변경
  • articles.html 에서 새 글 작성을 create 로 변경
# views.py

def create(request):
  if request.method == "POST":
      form = ArticleForm(request.POST)
      if form.is_valid():
          article = form.save()
          return redirect("article_detail", article.id)
  else:
      form = ArticleForm()

  context = {"form": form}
  return render(request, "create.html", context)

3-2. edit - update

edit는 GET, update는 POST로 들어오니, 조건문(if else)를 잘 활용해보자

그리고

  • edit view를 지우기
  • edit url path 지우기
  • edit.htmlupdate.html로 변경
  • article_detail.html 에서 글 수정 버튼 변경
    → 기존 edit이었던 부분을 update 로 수정
# views.py

def update(request, pk):
    article = Article.objects.get(pk=pk)
    if request.method == "POST":
        form = ArticleForm(request.POST, instance=article)
        if form.is_valid():
            article = form.save()
            return redirect("article_detail", article.pk)
    else:
        form = ArticleForm(instance=article)
    context = {
        "form": form,
        "article": article,
    }
    return render(request, "update.html", context)

→ Model Form은 instance라는 속성에 값이 있으면 해당 instance를 수정하고
값이 없으면 새로 생성하는 로직을 수행함

0개의 댓글