ホームページ >バックエンド開発 >Python チュートリアル >Pythonでdjangoフォームフォーム検証を使用する方法

Pythonでdjangoフォームフォーム検証を使用する方法

高洛峰
高洛峰オリジナル
2017-03-30 17:20:432127ブラウズ

1. djangomフォーム検証はじめに

場合によっては get、post、put を使用する必要があります。フロントエンド HTML ページのバックグラウンド処理例にデータを送信します。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Form</title>
</head>
<body>
  <p>
    <form action="url" method="post" enctype="multipart/form-data">{% csrf_token %}
      <input type="text" name="username"/>
      <input type="password" name="password"/>
      <input type="submit" value="submit"/>
    </form>
  </p>
</body>

フロントエンド送信とバックグラウンド取得:

from django.shortcuts import render,HttpResponse,redirect
from app01 import models
def Login(request):
  if request.method == "POST":
    username = request.POST.get("username")
    password = request.POST.get("password")
    return HttpResponse("Hello,%s"%(username))


これで基本的な機能は完了し、基本的には使用できます。ユーザーが入力した場合、要件(携帯電話番号の11桁のデータ長、パスワードの複雑さなど)に従わなかった場合、入力したデータは送信後に戻ったときに失われます

もちろんビューにデータを手動で入力する場合、すべてのデータを取得して Web ページに渡すことは可能ですが、非常に不便なので、Django は一連の問題を解決するために、よりシンプルで使いやすいフォームを提供します。ここでは、Django のプラグイン ライブラリについて言及しなければなりません。これは非常に強力で、シンプルで、拡張が簡単です。以下では、Django フォームの使用方法についてのみ説明します。 II. フォームフォーム検証アプリケーション

django APP に新しいモジュール form.py を作成する必要があります。具体的な内容は次のとおりです

class RegisterForm(forms.Form):
  email = forms.EmailField(required=True,
               error_messages={&#39;required&#39;: "邮箱不能为空"})
  password = forms.CharField(max_length=120,
                min_length=6,
                required=True,
                error_messages={&#39;required&#39;: "密码不能为空"})
  invite_code = forms.CharField(required=True,error_messages={&#39;required&#39;: "验证码不能为空"})

フロントエンドページ

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>register</title>
</head>
<body>
  <p>
    <form action="url" method="post" enctype="multipart/form-data">
      <input type="text" name="username"/>
      <input type="password" name="password"/>
      <input type="text" name="code"/>
      <input type="submit" value="submit"/>
    </form>
  </p>
</body>

バックエンドビュー処理

def register(request):
  if request.method == "POST":
    f = Reg_Form(request.POST)
    if f.is_valid():
      user = f.cleaned_data["username"]
      pwd = f.cleaned_data["password"]
      code = f.cleaned_data["code"]
      res_code = request.session.get("code", None)
      result = models.UserInfo.objects.filter(userexact=user,pwdexact=pwd)
      if code.upper() == res_code.upper() and result:
        models.UserInfo.objects.filter(userexact=user).update(status=1)
        request.session["user"] = user
        return redirect("/home")
      else:
        return render(request, "register.html", {"error": f.errors, "form": f})else:return render(request, "register.html")

Reg_Form(request.POST)フォームクラスを使用して送信されたデータを処理し、データの正当性を検証し、is_valid()が正当である後の論理処理を実行し、検証されたデータを保存しますインスタンス化後に返されるcleaned_dataでは、

cleaned_dataは辞書データ形式、

エラー情報

は form.errors に保存されます。たとえば、ビュー

print

(f.errors) ですべてのエラー情報を表示したい場合は、

テンプレート レンダリング

back を通じてユーザーの

 print(form.errors[&#39;username&#39;][0])
エラー メッセージを確認することができます。フロントエンド ページへ (例:
<form action="/form/" method="POST">
{% csrf_token %}
    <p class="input-group">
      {#接收后台传过来的form对象,自动生成input标签#}
      {{ form.user }}
      {#从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}
       {#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}
      {% if error.username.0 %}
      <span>{{ error.userusername.0 }}</span>
      {% endif %}
    </p>
    <p class="input-group">
      {{ form.password }}
      {% if error.pwd.0 %}
      <span>{{ error.password .0 }}</span>
      {% endif %}
    </p>
    <p>
      <input type="submit" value="提交" />
    </p>
  </form>
)3. 自己生成入力ボックス

フォーム クラス

class RegisterForm(forms.Form):
  style = &#39;form-control input-lg&#39;
  phone = forms.CharField(widget=forms.TextInput(attrs={&#39;class&#39;: style,
                              &#39;name&#39;: &#39;title&#39;})),
              required=True,
              error_messages={&#39;required&#39;: ugettext_lazy(&#39;*Required&#39;)})
  code = forms.CharField(widget=forms.NumberInput(attrs={&#39;placeholder&#39;: &#39;验证码&#39;,
                              &#39;class&#39;: style}),
              min_length=4,
              max_length=4,
              required=True,
              error_messages={&#39;required&#39;: ugettext_lazy(&#39;*Required&#39;)})
  password = forms.CharField(widget=forms.PasswordInput(attrs={&#39;placeholder&#39;: &#39;请输入密码&#39;,
                                 &#39;class&#39;: style}),
                min_length=6,
                required=True,
                error_messages={&#39;required&#39;: ugettext_lazy(&#39;*Required&#39;)})
views
def register(request):
  if request.method == "POST":
    f = RegisterForm(request.POST)
    if f.is_valid():
      user = f.cleaned_data["username"]
      pwd = f.cleaned_data["password"]
      code = f.cleaned_data["code"]
      res_code = request.session.get("CheckCode", None)
      result = models.UserInfo.objects.filter(userexact=user,pwdexact=pwd)
      if code.upper() == res_code.upper() and result:
        models.UserInfo.objects.filter(userexact=user).update(status=1)
        request.session["user"] = user
        return redirect("/home")
      else:
        return render(request, "login.html", {"error": f.errors, "form": f})
    else:
      return render(request, "login.html", {"error": f.errors, "form": f})
  else:
    # 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空
    f = Log_Form()
    return render(request, "login.html", {"form": f})

フロントエンド ページ

<body>
  <form action="/form/" method="POST">
  {% csrf_token %}
    <p class="input-group">
{#      接收后台传过来的form对象,自动生成input标签#}
      {{ form.user }}
{#      从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}
{#      如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}
    <p class="input-group">
      {{ form.email }}
      {% if error.email.0 %}
      <span>{{ error.email.0 }}</span>
      {% endif %}
    </p>
     <p class="input-group">
      {{ form.password }}
      {% if error.password.0 %}
      <span>{{ error.password.0 }}</span>
      {% endif %}
    </p>
       <p class="input-group">
      {{ form.code }}
      {% if error.book_type.0 %}
      <span>{{ error.code.0 }}</span>
      {% endif %}
    </p>
    <p>
      <input type="submit" value="提交" />
    </p>
  </form>
</body>
</html>

4. フォーム検証の改善

docs.djangoproject.com/ en/dev/ref/forms/validation/

フォーム検証の実行順序は init、clean、validate、save

ここで clean と validate は form.is_valid() メソッド内にあります

clean を呼び出すときに発生した例外

Exception

値: 型 'NoneType' の引数は反復可能ではありません

Cleaned_data の特定のフィールド値はリストである必要があるかもしれませんが、実際には null 値です。

clean メソッドを書き換えるときは、cleaned_data を返すことを忘れないでください

これにより、ユーザーが送信したデータは、フォーム クラスで検出された後、論理的に処理されてユーザーに返されるようになります。返品処理の必要がなく、より便利で合理的です

追加:

5.フォームの4つの初期化メソッド

①oneform(initial={'onefield':value})をインスタンス化する

②定義時フィールドに初期化値 oneformfield = Forms を与えます

③Form クラスの init() メソッドを書き換えます: self.fields['onefield'].initial = value

④パラメーター instante を渡すとき (つまり、 oneform(instance=onemodel_instance)) を form に書き換えた場合、最初の 3 つの初期化メソッドはすべて無効になります。init を書き換えて、最初に親クラスの init を呼び出してから③のメソッドを使用しても、やはり無効になります (あまりかっこよくありません)。 )。

この時点でフィールド値を再初期化したい場合は、init() で self.initial['title'] = value を使用し、その値を Form クラスの初期

属性

辞書に直接代入するだけです。

from django import forms
class RegisterForm(forms.Form):
  email = forms.EmailField(required=True,
               error_messages={&#39;required&#39;: "邮箱不能为空"})
  password = forms.CharField(max_length=120,
                min_length=6,
                required=True,
                error_messages={&#39;required&#39;: "密码不能为空"})
  invite_code = forms.CharField(required=True,error_messages={&#39;required&#39;: "验证码不能为空"})
  def clean(self):
    # 用户名
    try:
      email = self.cleaned_data['email']
    except Exception as e:
      raise forms.ValidationError(u"注册账号需为邮箱格式")
    # 验证邮箱
    user = User.objects.filter(username=email)
    if user: # 邮箱已经被注册了
      raise forms.ValidationError(u"邮箱已被注册")
    # 密码
    try:
      password = self.cleaned_data['password']
    except Exception as e:
      print('except: ' + str(e))
      raise forms.ValidationError(u"请输入至少6位密码")
    return self.cleaned_data

上記は編集者が紹介した Python での Django フォーム検証の方法です。ご質問があればメッセージを残してください。編集者がすぐに返信します。 。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。

Python で Django フォームのフォーム検証を使用する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。