1. django form 서론
django 에서는 form 이라는 편리한 도구를 제공합니다. models.py에서 작성한 모델을 바탕으로 템플릿 파일에서 models.py의 model에 맞게 폼을 형성해주는 것입니다. 물론 django에서 제공하기에 views.py에서도 연동하여 이용할 수 있습니다. 여러가지 귀찮은 검사를 django에게 맡길 수 있습니다. 그리고 복잡한 html 코드를 단순하게 줄여줍니다.
django form documentation : https://docs.djangoproject.com/en/2.0/topics/forms/
2. django form 유무에 따른 html 코드 비교
<form action="." method="post"> {% csrf_token %} <div> <label for="name">username:</label> <input type="text" id="name" /> </div> <div> <label for="mail">E-mail:</label> <input type="email" id="mail" /> </div> <div> <label for="password">password:</label> <textarea id="password"></textarea> </div> <div> <label for="password_confirm">password_confirm:</label> <textarea id="password_confirm"></textarea> </div> <div class="button"> <button type="submit">Submit</button> </div> </form> | cs |
하나의 입력 폼을 작성할 때 두 줄의 코드를 필요로 하게 됩니다.
이번엔 form을 사용했을 때의 코드입니다.
<form class="form-horizontal" method="post" action="."> {% csrf_token %} <div class="form-group"> <label class="control-label col-sm-2" for="id_username">Username(ID)</label> <div class="col-sm-10">{{ form.username }}</div> </div> <div class="form-group"> <label class="control-label col-sm-2" for="id_email">Email</label> <div class="col-sm-10"> {{ form.email }} </div> </div> <div class="form-group"> <label class="control-label col-xs-2 col-sm-2" for="id_password">Password</label> <div class="col-sm-10"> {{ form.password }} </div> </div> <div class="form-group"> <label class="control-label col-xs-2 col-sm-2" for="id_password_confirm">Password</label> <div class="col-sm-10"> {{ form.password_confirm }} </div> </div> <div class="form-group"> <div class="col-xs-offset-5 col-sm-offset-5"> <button class="btn btn-default" type="submit">Create</button> </div> </div> </form> | cs |
얼핏 보면 더 코드가 증가한 것 같지만 부트스트랩을 이용하기 위해 들어간 코드들을 제외하면 훨씬 더 간결해졌음을 알 수 있습니다.
특히 하나의 입력 폼이 {{ form.email }} 처럼 짧아지게 됩니다. 코드의 재사용시에도 {{ form.email }} 같이 짧게 이용할 수 있으니 효율적입니다.
3. models.py
class User(AbstractUser): | cs |
이러므로 이번엔 AbstractUser를 살펴보겠습니다.
class AbstractUser(AbstractBaseUser, PermissionsMixin): username = models.CharField( _('username'), max_length=150, unique=True, ) email = models.EmailField(_('email address'), blank=True) | cs |
AbstractBaseUser 까지 살펴보면 이렇습니다.
@python_2_unicode_compatible class AbstractBaseUser(models.Model): password = models.CharField(_('password'), max_length=128) | cs |
결국 username과 email, password 까지 위에서 사용된 모든 필드를 찾을 수 있었습니다.
이 필드들이 바탕이 되어 forms.py에서 형성되게 됩니다. 각각 CharField와 EmailField가 사용되었습니다.
4. forms.py
from django import forms from django.contrib.auth.models import User | cs |
그 다음에 필요한 폼을 작성하시면 됩니다.
class UserCreateForm(forms.ModelForm): username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control ', 'placeholder': 'Username'})) email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'email'})) password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'})) password_confirm = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password_confirm'})) class Meta: model = User fields = ['username', 'email', 'password'] | cs |
이렇게 작성했습니다. 위에서 언급한 것처럼 CharField와 EmailField가 그대로 사용되었습니다. widget은 html에서 어떤 입력창을 사용하는지를 결정합니다. 그 옆에 괄호 안의 'class', 'placeholder'는 그대로 html에서 반영되는 요소들입니다. 원하는대로 적용해주세요. 저는 부트스트랩을 이용중이니 'class'에 'form-control'을 추가해줬습니다.
4. views.py
views.py의 def create(request): 에서 이 form을 사용한다고 해 봅시다. 그렇게 되면 얼마나 편리한지 알 수 있게 됩니다.
def create(request): if request.method == 'POST': form = UserCreateForm(request.POST) username = form.data['username'] email = form.data['email'] password = form.data['password'] password_confirm = form.data['password_confirm'] if form.is_valid: pass else: form = UserCreateForm() return render(request, 'create.html', {'form': form}) | cs |
이게 다입니다. 폼은 request와 함께 views.py로 전송되는데 그 폼을 읽기 위해서 단지 form = UserCreateForm(request.POST) 이 한 줄이 필요합니다. 그 다음엔 form.is_valid 같은 유효성 검사도 django에서 다 지원해주니 원하시는 대로 사용하시면 됩니다.
'Python' 카테고리의 다른 글
[ASGI] ASGI와 websocket 연결 설명 (0) | 2018.02.13 |
---|---|
[helloworld] for문 사용법 (0) | 2018.02.11 |
[django] django channels 사용법 (0) | 2018.02.10 |
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
[django] django 에서 recaptcha 사용 (0) | 2018.02.05 |