티스토리 뷰
어떠한 데이터든 간에 입력 데이터라고 한다면 장고 폼을 이용하여 유효성 검사를 해야 한다.
HTML forms
<form>...</form>
<input> elements, a form must specify two things:
- where: the URL to which the data corresponding to the user's input should be returned
- how: the HTTP mehtod the data should be returned by
Django's role in forms
- preparing and restructuring data to make it ready for rendering
- creating HTML forms for the data
- receiving and processing submitted forms and data from the client
The Django Form class
A form class's fields map to HTML form <input> elements. (A ModelForm maps a model class's fields to HTML form <input> elements via a Form; this is what the Django admin is based upon.)
A form's fields are themselves classes; they manage form data and perform validation when a form is submitted. A DateField and a FileField handle very different kinds of data and to do different things with it.
form's fields
{{ form.name_of_field }}
form.hidden_fields
form.visible_fields
form.non_field_errors
form.subject.errors
유효성 검사하기
장고 폼은 파이썬 딕셔너리의 유효성을 검사하는 데 최상의 도구.
import csv
import StringIO
from django import forms
from .models import Purchase, Seller
class PurchaseForm(forms.ModelForm):
class Meta:
model = Purchase
def clean_seller(self):
seller = self.cleaned_data["seller"]
try:
Seller.objects.get(name=seller)
except Seller.DoesNotExist:
msg = "{0} does not exist in purchase #{1}.".format(seller, self.cleaned_data["purchase_number"])
raise forms.ValidationError(msg)
return seller
def add_csv_purchases(rows):
rows = StringID.StringIO(rows)
records_added = 0
errors = []
# 한 줄당 하나의 dict를 생성, 단 첫 번째 줄은 키 값으로 함
for row in csv.DictReader(rows, delimiter=","):
# PurchaseForm에 원본 데이터 추가
form = PurchaseForm(row)
# 원본 데이터가 유효한지 검사
if form.is_valid():
# 원본 데이터가 유효하므로 해당 레코드 저장
form.save()
records_added += 1
else:
errors.append(form.errors)
return records_added, errors
'Django' 카테고리의 다른 글
queryset (0) | 2019.07.15 |
---|---|
Angular4 (0) | 2019.07.14 |
Class ListView() (0) | 2019.07.13 |
TypeError (0) | 2019.07.12 |
클래스 기반 뷰의 모범적인 이용 (0) | 2019.07.11 |