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

Django フォームの処理

Djangoでフォームを作成するのは、モデルを作成するのと似ています。ここでは、Djangoのクラスを継承して、このクラスの属性フィールドをフォームに追加する必要があります。私たちのmyappフォルダにforms.pyファイルを追加して、アプリケーションのフォームを作成します。私たちはログインフォームを作成します。

myapp/forms.py

# ファイル名 : example.py
# 著作権 : 2020 By w3codebox
# Author by : ja.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、チェックボックス入力はチェックボックスなどです。

ビューでフォームを使用します

HTTPリクエストにはGETとPOSTの2種類があります。Djangoでは、ビューのリクエストオブジェクトにパラメータとして渡される属性「方法」があります。この属性にはリクエストのタイプが設定され、POSTで渡されるすべてのデータはrequest.POST辞書を通じてアクセスできます。

myappで作成します/views.py でログインビューを作成します −

# ファイル名 : example.py
# 著作権 : 2020 By w3codebox
# Author by : ja.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
# 著作権 : 2020 By w3codebox
# Author by : ja.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
# 著作権 : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
{% csrf_token %}

ログインテンプレートが手に入ったら、ログイン後の表示にテーブルを処理してloggedin.html テンプレートを表示する必要があります。

# ファイル名 : example.py
# 著作権 : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       You are: <strong>{{username}}</strong>
    </body>
 </html>

今、私たちはURLsに対して始める必要があります: myapp/urls.py

# ファイル名 : example.py
# 著作権 : 2020 By w3codebox
# Author by : ja.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 テンプレートが以下のように表示されます −

上記のテーブルが提出された後、フォーマットは有効です。私たちの例では、必ず2つのフィールドを入力して、以下の結果が得られます −

ユーザー名がpoloで、パスワードを忘れた場合、以下のメッセージが表示されます −

私たちの独自のフォーム検証を使用して

上記の例では、フォームを検証しています −

# ファイル名 : example.py
# 著作権 : 2020 By w3codebox
# Author by : ja.oldtoolbag.com
# Date : 2020-08-08
MyLoginForm.is_valid()

私たちはDjangoの自前のフォーム検証エンジンを使用しており、インスタンスではこのフィールドが必須であることを確認しています。今、ユーザーがDreamreal項としてデータベースに存在するか確認するために試みてみましょう。この点で、myapp/forms.py は −

# ファイル名 : example.py
# 著作権 : 2020 By w3codebox
# Author by : ja.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("ユーザーが私たちのデータベースに存在しません!")
       return username

「is_valid」メソッドを呼び出した後、正しい出力を得ることができます。ユーザーが私たちのデータベースにある場合のみです。フォームフィールドをクエリする場合は、フォームクラスのフィールドに対応する名前を持つ「clean_」で始まるメソッドを追加するだけで十分です。forms.ValidationError エラーを発生させることは非常に重要です。