본문 바로가기

Web Programming/Django

Form 활용하기


모델 형식에 맞는 입력공간 만들기

하나하나하 Form 태그 만드는 것의 한계

그래서 장고 내부의 forms.py를 활용하기!


Forms.py

1) 모델 기반 입력공간 만들기

from django import forms.ModelForm

2) 임의의 입력공간 만들기

from django import forms.Form


# model(Form.py)

from django import forms.Form

class myForm(forms.ModelForm):

class Meta:

어떤 모델을 기반으로 한 입력공간인가

그 모델 중 어떤 항목을 입력받을 것인가

img = forms.ImageField

text = forms.TextField(or forms.CharField)

tims = forms.DateTimeField


project/blog/forms.py 만들기

1
2
3
4
5
6
7
8
from django import forms
from .models import Blog
 
# 만약 모델 기반이 아니라면 forms.Form
class BlogPost(forms.ModelForm):
    class Meta:
        model = Blog
        fields = ['title' , 'body']
cs


다양한 Field가 있지만, 모델을 기반으로 한 입력공간 만들기에 집중!

Form.py로 파일을 분할해서 관리할 수 있도록 한다!


# url 추가해주기


1
2
# project/blog/urls.py
path('newblog', views.blogpost, name="newblog"),
cs



# views.py

from .form import myForm

def create(request):


수행역할 

1. 처음 new.html 들어갔을 떄 빈 입력공간 띄우기

-> Get


2. 이용자가 뭘 입력하면 그입력값들 처리하기

-> Post

.is_valid(적절한 값 확인)

form.save(commit=False)

# 일단 저장하지 말고 form 객체말고 model 객체에 접근

# model 객체 안의 date 변수에 접근, 값 수정

# model 객체 저장


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# views.py
from .forms import BlogPost
...
def blogpost(request):
    # 입력된 내용 처리 -> POST
    if request.method == 'POST':
        form = BlogPost(request.POST)
        if form.is_valid(): # 잘입력된지 체크
            post = form.save(commit=False)
            post.pub_date = timezone.now()
            post.save() # 저장하기
            return redirect('home'# 홈으로
    
 
    # 빈 페이지 띄워주는 기능 -> GET
    else :
        form = BlogPost()
        return render(request, 'new.html', {'form':form})
cs


# template

{{form}} 을 통해 출력

Form안의 내용을 어떤 태그로 감싼 채 출력할지 미리 결정!

{{form.as_table}} # 테이블

{{form.as_p}} # paragraph 

{{form.as_ul}} # 리스트


1
2
3
4
5
6
7
8
9
10
11
# project/blog/templates/new.html
<div class = "container">
    <form method ="POST">
    {% csrf_token %}
    <table>
        {{form.as_table}}
    </table>
    <br>
        <input class="btn btn dark" type="submit" value="제출하기">
    </form>
</div>
cs



# 참고사항

모델기반이 아닌 임의의 입력공간 만들기


1
2
3
4
5
6
7
8
9
10
# forms.py
from django import forms
from .models import Blog
 
class BlogPost(forms.Form):
    email = forms.EmailField()
    files = forms.FileField()
    url = forms.URLField()
    words = forms.CharField(max_length=200)
    max_number = forms.choiceField(choices=[('1','one'),('2','two'),('3','three')])
cs