티스토리 뷰

728x90

 

 

++ 장고 공식 문서는 항상 확인하기 

https://docs.djangoproject.com/en/4.2/

 

 

 

1.  Form 선언하기

 

  • views.py 를 변형시켜준다.
from .forms import ArticleForm

....

def new(request):
  forms = ArticleForm()
  context = {"forms":forms}
  return render(request, "new.html", context)

 

  • forms.py 를 생성하여 선언해준다.
from django import forms


class ArticleForm(forms.Form):
    title = forms.CharField(max_length=50)
    content = forms.CharField()

 

  • new.html 파일을 수정해준다. - 간단하게 forms 로 해결되는 것을 볼 수 있다.!!
{% extends 'base.html' %} 

{% block content %}
  <h1>New Article</h1>

  <form action="{% url 'create' %}" method="POST">
    {% csrf_token %}
    {{ forms.as_p }}

    <button type="submit">저장</button>
  </form>

  <a href="{% url 'articles' %}">목록 으로</a>

{% endblock content %}

 

 

 

 

 

  • forms.py 을 공식문서를 참고하여 수정해보자.
from django import forms


class ArticleForm(forms.Form):
    # 앞은 데이터베이스에 저장될 값, 뒤는 사용자에게 보여질 값
    GENRE_CHOICES = [
        ("technology", "Technology"),
        ("life", "Life"),
        ("hobby", "Hobby"),
    ]

    title = forms.CharField(max_length=10)
    content = forms.CharField(widget=forms.Textarea)
    genre = forms.ChoiceField(choices=GENRE_CHOICES)

 

 

 

 

 

 

 

 

 

 

 

2.  Model Form 써보기

 

  • forms.py 을 모델폼으로 수정해보자.
from django import forms

from articles.models import Article


class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = "__all__" # 모든 필드를 다 가져와서 모델로 만들어줘
        # exclude = ["title"] # 대신 그 중에 타이틀만 빼주고 (제외)

 

 

 

  • views.py 을 모델폼으로 수정해보자. - 폼 형식에 맞아야만 반환하고 아니면 반환하지 않는다.
...
def create(request):
  form = ArticleForm(request.POST) # form에 request.POST에 있는 데이터 채워
  if form.is_valid(): # form 형식에 맞으면
      article = form.save() # 저장하고 해당 객체 반환 
      return redirect("detail", article.id)
  return redirect("new")
...

 

 

 

 

 

 

 

 

 

3.  new - create 수정하기

 

  • views.py 을 수정해보자.
def create(request):
  if request.method == "POST":
      form = ArticleForm(request.POST)
      if form.is_valid():
          article = form.save()
          return redirect("detail", article.id)
  else:
      form = ArticleForm()

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

 

 

  • new.html 파일을 create.html 로 수정(이름바꾸기)
  • new의 view.py에서 삭제함
  • urls.py에서도 new 삭제하기 
  • articles.html 도 new -> create 로 바꾸어줌

 

 

 

 

 

 

 

 

 

 

4. edit - update 수정하기

  • edit - update를 살펴보면 하나는 get 방식, 하나는 post 방식이라서  new-create 처럼 바꾸면 편할 것 같다!
  • 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)

 

 

  • edit.html 파일을 update.html 로 수정(이름바꾸기)  -
    {{ form.as_p }}​
  • view.py에서 edit 삭제함
  • urls.py에서도 edit 삭제하기 
  • detail.html 도 edit -> update 로 바꾸어줌
  • form이면 form으로 forms면 forms로 통일해줘야함 = form으로 통일하기

 

 

 

 

 

 

 

5. URL Namespace

 

  •  이름이 같은 앱이 있으면 어떤 앱을 먼저 처리하느냐에 따라서 처리한 화면이 달라진다.
  • 그래서 앱 네임을 따로 정해서 어떤 경로로 정확하게 가는지 해줘야함
from django.urls import path
from . import views #.은 내 위치

app_name = 'articles'
urlpatterns = [

    path('', views.articles, name='articles'),
    path("create/", views.create, name="create"),
    path("<int:pk>/", views.detail, name="detail"),
    path("<int:pk>/delete/", views.delete, name="delete"),
    path("<int:pk>/update/", views.update, name="update"),

    path('data_throw/', views.data_throw, name='data_throw'),
    path('data_catch/', views.data_catch, name='data_catch'),
]

 

 

  • urls.py의 path들을 다 찾아가 바꿔주어야 한다. 
"{% url 'articles:detail' article.pk %}"

 

  • views.py 을 수정해보자.- 아래의 형태처럼 수정해주어야한다.
return redirect("articles:detail", article.id)

 

  • users 의 파일들도 똑같이 해줘야한다.
  • html 파일들도 구분을 하기 위해 templates 에 하위폴더로 articles 와 users 를 각각 만들어서 html 파일을 넣어서 따로 관리 할 수 있도록 한다.
return render(request, "articles/data_catch.html", context)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형
TAG
more
최근에 올라온 글