ホームページ >バックエンド開発 >Python チュートリアル >Pythonでdjangoフォームフォーム検証を使用する方法
<!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))
class RegisterForm(forms.Form): email = forms.EmailField(required=True, error_messages={'required': "邮箱不能为空"}) password = forms.CharField(max_length=120, min_length=6, required=True, error_messages={'required': "密码不能为空"}) invite_code = forms.CharField(required=True,error_messages={'required': "验证码不能为空"})フロントエンドページ
<!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 に保存されます。たとえば、ビューテンプレート レンダリング
back を通じてユーザーのprint(form.errors['username'][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 = 'form-control input-lg' phone = forms.CharField(widget=forms.TextInput(attrs={'class': style, 'name': 'title'})), required=True, error_messages={'required': ugettext_lazy('*Required')}) code = forms.CharField(widget=forms.NumberInput(attrs={'placeholder': '验证码', 'class': style}), min_length=4, max_length=4, required=True, error_messages={'required': ugettext_lazy('*Required')}) password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': '请输入密码', 'class': style}), min_length=6, required=True, error_messages={'required': ugettext_lazy('*Required')})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={'required': "邮箱不能为空"}) password = forms.CharField(max_length=120, min_length=6, required=True, error_messages={'required': "密码不能为空"}) invite_code = forms.CharField(required=True,error_messages={'required': "验证码不能为空"}) 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 サイトに注目してください。