English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 오류를 일으키는 것은 중요합니다.