day11ジャンゴ:fromsコンポーネント:データのリセットカスタムルールデータをレンダリングデータのチェックサム・エラー・メッセージ
A .Django:フォームコンポーネント
機能点検データコンポーネント1.forms
1.1。基本的な構文
1.1.1。新しいコンポーネントのクラスを形成し
ジャンゴインポートフォームから
クラスBookForm(forms.Form):#クラスのフォームを作成します
タイトル= forms.CharField(MAX_LENGTH = 32)
価格= forms.IntegerField()
メール= forms.EmailField()
1.1.2コマンドライン構文テスト
app01.views輸入BookFormから
#1。代表的な認証が失敗しました
FM = BookForm({ 'タイトル': 'bajie'、 '価格':2000、 '電子メール': '163'})#インスタンス化
fm.is_valid()#DO検証:このステップでは、そうでない場合は、でなければならない善悪のキーの検証GET
アウト[5]:偽
fm.cleaned_data#正しいキー
OUT [6]:{ 'タイトル': 'bajie'、 '価格' 2000}
誤ったキーfm.errorsの#
アウトは、[7]:{ 'メール':[ '有効なメールアドレスを入力します。']}
例の検証を経て#2。
FM = BookForm({ 'タイトル': 'bajie'、 '価格' 2000、 '電子メール': '[email protected]'})#インスタンス化:注:値のペアが複数ではなく、より少ない、ことはできませんキーの間違い
fm.is_valid()#DO検証
アウト[9]:真
fm.cleaned_data#正しいキー
アウト[10]:{ 'タイトル': 'bajie'、 '価格':2000、 '電子メール': '[email protected]'}
誤ったキーfm.errorsの#
OUT [11]:{}
1.2。実施例レジスタ(フォームのフォームを使用して)
ユーザー名:以上5の長さ、パスワード:純粋なデジタル、電子メールである:形式に準拠する必要があります
入力データ形式の問題であれば、ユーザーに
models.py
django.db輸入モデルから
#ここにあなたのモデルを作成します。
クラスのUserInfo(models.Model):
ユーザー= models.CharField(MAX_LENGTH = 32)
PWD = models.CharField(MAX_LENGTH = 32)
メール= models.CharField(MAX_LENGTH = 32)
urls.py
django.contribインポート管理者から
django.urlsインポートパスから
app01インポートビューから
urlpatterns = [
パス( '管理/'、admin.site.urls)、
パス( 'レジスタ/'、views.register)、
パス( 'ログイン/'、views.login)、
]
views.py
django.shortcutsからのHttpResponse、レンダリングインポート
ジャンゴインポートフォームから
app01.modelsインポートからのUserInfo
#ここにあなたの意見を作成します。
クラスユーザーフォーム(forms.Form):
MSG = {「必要」:「このフィールドは空白にすることはできません」、「無効」:「フォーマットエラー」}
#FORMフォームおよびフォーム内のユーザー= forms.CharField(MIN_LENGTH = 5、error_messages = MSG)同じジョブにキー名:ディスプレイの内容を空にし、その名前が必要です
PWD = forms.IntegerField()
email = forms.EmailField(error_messages=msg)
def login(request):
return render(request, 'login.html', locals())
def register(request):
if request.method == 'POST':
fm = UserForm(request.POST)
if fm.is_valid():
UserInfo.objects.create(**fm.cleaned_data)
return HttpResponse('ok')
else:
print("cleaned_data: ", fm.cleaned_data)
print("errors: ", fm.errors)
print(type(fm.errors)) #<class 'django.forms.utils.ErrorDict'>可以理解成是一个字典
print(type(fm.errors.get('user'))) #<class 'django.forms.utils.ErrorList'>可以理解成是一个列表
# print(type(fm.errors.get('user')[0])) #取出错误字段的错误信息
errors = fm.errors
return render(request, 'register.html', locals())
else:
return render(request, 'register.html', locals())
templates > register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>用户名: <input type="text" name="user"><span>{{ errors.user.0 }}</span></p>
<p>密码: <input type="password" name="pwd"><span>{{ errors.pwd.0 }}</span></p>
<p>邮箱: <input type="text" name="email"><span>{{ errors.email.0 }}</span></p>
<input type="submit">
</form>
</body>
</html>
2.forms组件的页面显示错误信息
3.渲染页面和重置数据
register.html需要我们自己写, 不然呢?
而且会把forms组件的属性加到标签里面: 比如: minlenght = 5, 前端可以给我们检验不挺好吗? 是的, 但是万一检验不了呢,如IE, 所以我们要在后端做校验.
告诉前端不要你做校验: <form action="" method="post" novalidate>
而且实现了: 提交后, 正确的内容不消失, 错误的才清空:
方式一: forms组件帮我们写, 只能帮我们渲染input,但不包括type='submit'的input(包括输入框前面的User; Pwd; Email)
views.py
def register(request):
if request.method == 'POST':
fm = UserForm(request.POST)
if fm.is_valid():
UserInfo.objects.create(**fm.cleaned_data)
return HttpResponse('ok')
else:
print("cleaned_data: ", fm.cleaned_data)
print("errors: ", fm.errors)
print(type(fm.errors))
print(type(fm.errors.get('user')))
# print(type(fm.errors.get('user')[0]))
errors = fm.errors
return render(request, 'register.html', locals())
else:
fm = UserForm()
return render(request, 'register.html', locals())
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" novalidate>
{% csrf_token %}
{{ fm.as_p }}
<input type="submit">
</form>
</body>
</html>
方式二: 只替换 input 标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" novalidate>
{% csrf_token %}
<p>用户名: {{ fm.user }}<span>{{ errors.user.0 }}</span></p>
<p>密码: {{ fm.pwd }}<span>{{ errors.pwd.0 }}</span></p>
<p>邮箱: {{ fm.email }}<span>{{ errors.email.0 }}</span></p>
<input type="submit">
</form>
</body>
</html>
方式二: 只替换 input 标签, 在forms组件里设置标签的属性
views.py
class UserForm(forms.Form):
msg = {"required": "该字段不能为空", "invalid": "格式错误"}
user = forms.CharField(min_length=5,
error_messages=msg,
widget=widgets.TextInput(attrs={"class": "form-control"}))
pwd = forms.IntegerField(widget=widgets.PasswordInput(attrs={"class": "form-control"}))
email = forms.EmailField(error_messages=msg,
widget=widgets.EmailInput(attrs={"class": "form-control"}))
register.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 101 Template</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<h1>注册界面</h1>
<div class="container">
<div class="row">
<div class="col-md-6">
<form action="" method="post" novalidate>
{% csrf_token %}
<p>用户名: {{ fm.user }}<span>{{ errors.user.0 }}</span></p>
<p>密码: {{ fm.pwd }}<span>{{ errors.pwd.0 }}</span></p>
<p>邮箱: {{ fm.email }}<span>{{ errors.email.0 }}</span></p>
<input type="submit">
</form>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
</body>
</html>
方式三: 这个方式应该是你喜欢的
方式一的简单但不灵活
方式二的灵活但不简单
views.py
class UserForm(forms.Form):
msg = {"required": "该字段不能为空", "invalid": "格式错误"}
user = forms.CharField(min_length=5,
error_messages=msg,
label="用户名",
widget=widgets.TextInput(attrs={"class": "form-control"}))
pwd = forms.IntegerField(label="密码",
widget=widgets.PasswordInput(attrs={"class": "form-control"}))
email = forms.EmailField(error_messages=msg,
label="邮箱",
widget=widgets.EmailInput(attrs={"class": "form-control"}))
register.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 101 Template</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<h1>注册界面</h1>
<div class="container">
<div class="row">
<div class="col-md-6">
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in fm %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{{ field }} <span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit">
</form>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
</body>
</html>
4.自定义规则: 钩子的简单使用
4.1.用户名不能重复
4.2.密码不能是纯数字
class UserForm(forms.Form):
msg = {"required": "该字段不能为空", "invalid": "格式错误"}
user = forms.CharField(min_length=5,
error_messages=msg,
label="用户名",
widget=widgets.TextInput(attrs={"class": "form-control"}))
pwd = forms.CharField(label="密码",
widget=widgets.PasswordInput(attrs={"class": "form-control"}))
email = forms.EmailField(error_messages=msg,
label="邮箱",
widget=widgets.EmailInput(attrs={"class": "form-control"}))
def clean_user(self):
val = self.cleaned_data.get('user')
rst = UserInfo.objects.filter(user=val)
if not rst:
return val
else:
raise ValidationError('用户名不能重复')
def clean_pwd(self):
val = self.cleaned_data.get('pwd')
if val.isdigit():
raise ValidationError('密码不能是纯数字')
else:
return val