티스토리 뷰
AI웹 개발자 과정 공부 (팀스파르타)/Django (장고)
24.04.22_TIL (1) (Django Form & Model Form & URL Namespace )
티아(tia) 2024. 4. 22. 21:02728x90
++ 장고 공식 문서는 항상 확인하기
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)
반응형
'AI웹 개발자 과정 공부 (팀스파르타) > Django (장고)' 카테고리의 다른 글
24.04.25_TIL (1) (Django 회원가입, 탈퇴, 정보수정) (0) | 2024.04.25 |
---|---|
24.04.22_TIL (2) (Django Authentication System) (0) | 2024.04.22 |
24.04.19_TIL (3) (Django MTV CRUD - 2 ) (0) | 2024.04.19 |
24.04.19_TIL (2) (Django MTV CRUD - 1 ) (0) | 2024.04.19 |
24.04.19_TIL (1) (Django Model & ORM & CRUD) (1) | 2024.04.19 |