English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Django 폼 처리

Django에서 폼을 생성하면 모델을 생성하는 것과 유사합니다. 여기서는 Django 클래스를 상속받아 이 클래스의 속성 필드를 폼에 추가합니다. myapp 폴더에 forms.py 파일을 추가하여 우리 애플리케이션의 폼을 생성합니다. 우리는 로그인 폼을 생성할 것입니다.

myapp/forms.py

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
#-*- coding: utf-8 -*-
 from django import forms
 class LoginForm(forms.Form):
    user = forms.CharField(max_length = 100)
    password = forms.CharField(widget = forms.PasswordInput())

위에서 보듯, 필드 타입은 "widget" 매개변수를 통해 HTML 렌더링할 수 있습니다; 우리의 예제에서는 비밀번호를 숨기고 표시하지 않습니다. 우리의 예제에서는 비밀번호를 표시하지 않고 숨기려고 합니다. 날짜 입력은 DateInput, CheckboxInput은 체크박스 등입니다.

뷰에서 양식을 사용하다

HTTP 요청은 GET과 POST 두 가지가 있습니다. Django에서는 요청 객체에 "method"이라는 이름의 속성이 있으며, 요청 타입이 설정되고, POST를 통해 전달된 모든 데이터는 request.POST 딕셔너리를 통해 접근할 수 있습니다.

그러면 "myapp"에서/views.py에서 로그인 뷰를 생성하다 -

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
#-*- coding: utf-8 -*-
 from myapp.forms import LoginForm
 def login(request):
    username = "not logged in"
    if request.method == "POST":
       #Get the posted form
       MyLoginForm = LoginForm(request.POST)
       if MyLoginForm.is_valid():
          username = MyLoginForm.cleaned_data['username']
    else:
       MyLoginForm = Loginform()
 
    return render(request, 'loggedin.html', {"username" : username})

이 뷰는 "loggedin.html" 로 로그인을 표시하는 양식 결과를 통해 작동합니다. 이를 테스트하기 위해, 우리는 먼저 로그인 양식 템플릿이 필요합니다. 그 이름을 "login.html"으로 지정하겠습니다:

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       <form name="form" action="{% url "myapp.views.login" %}" 
          method="POST">{% csrf_token %}
          <div style="max-width:470px;">
             <center> 
                <input type="text" style="margin-left:20%;" 
                   placeholder="Identifiant" name="username" />
             </center>
          </div>
 
          <br>
          <div style="max-width:470px;">
             <center>
                <input type="password" style="margin-left:20%;" 
                   placeholder="password" name="password" />
             </center>
          </div>
 
          <br>
          <div style="max-width:470px;">
             <center> 
                <button style="border:0px; background-color:#4285F4; margin-top:8%;
                   height:35px; width:80%;margin-left:19;" type = "submit" 
                   value = "Login" >
                   <strong>Login</strong>
                </button>
             </center>
          </div>
       </form>
    </body>
 </html>

템플릿은 로그인 양식을 표시하고, 위에서 로그인을 확인한 결과를 표시합니다. 아마도 이미 알고 있지만, 이 템플릿은 당신의 웹사이트에서 CSRF 공격을 방지하기 위한 태그입니다.

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
{% csrf_token %}

로그인 템플릿을 가지고 있으면, 입력된 데이터를 처리한 후 loggedin.html 템플릿을 표시해야 합니다.

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       당신은 : <strong>{{username}}</strong>
    </body>
 </html>

이제, URLs을 시작하기 위해 필요한 것만 가져와야 합니다: myapp/urls.py

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, url
 from django.views.generic import TemplateView
 urlpatterns = patterns('myapp.views',
    url(r'^connection/', TemplateView.as_view(template_name = 'login.html')),
    url(r'^login/', 'login', name = 'login'))

접근할 때"/myapp/"connection"이면, login.html 템플릿이 다음과 같이 표시됩니다 −

위의 테이블을 제출하면, 형식이 유효합니다. 우리의 예제에서는 두 필드를 반드시 입력해야 하며, 다음 결과를 얻습니다 −

이름이 polo이고, 비밀번호를 잊었다면, 다음 메시지를 받을 것입니다 −

우리의 형식 검증을 사용합니다

위의 예제에서, 형식을 검증합니다 −

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
MyLoginForm.is_valid()

우리는 Django의 자체 형식 검증 엔진을 사용하며, 인스턴스에서는 이 필드가 필수적인지 확인합니다. 지금부터 시도해 보겠습니다. 이를 위해 myapp/forms.py는 −

# 파일 이름 : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
#-*- coding: utf-8 -*-
 from django import forms
 from myapp.models import Dreamreal
 class LoginForm(forms.Form):
    user = forms.CharField(max_length = 100)
    password = forms.CharField(widget = forms.PasswordInput())
    def clean_message(self):
       username = self.cleaned_data.get("username")
       dbuser = Dreamreal.objects.filter(name = username)
       if not dbuser:
          raise forms.ValidationError("User does not exist in our db!")
       return username

현재, 'is_valid' 메서드를 호출한 후, 사용자가 우리의 데이터베이스에 있을 때만 올바른 출력을 얻게 됩니다. 폼 필드를 검색하려면, 'clean_'으로 시작하는 메서드를 추가하고, 필드 이름이 폼 클래스 필드와 일치하도록 합니다. forms.ValidationError 오류를 일으키는 것은 중요합니다.