Django--Form組件
阿新 • • 發佈:2019-03-12
可用 strong per cts choices log 性別 ati 有一個
一 . Form介紹
我們之前一下用form表單向後臺提交數據, 裏面寫的是input標簽. 我們在好多場景下需要對用戶輸入的內容進行校驗,比如說註冊信息.
Django form組件就實現了上述的功能
form組件主要功能:
生成頁面可用HTML標簽
對用戶提交的數據進行校驗
保留上次輸入的內容
使用form組件實現註冊功能
# views.py文件 from django import forms # 按照Django form組件的要求自己寫一個類 class RegForm(forms.Form): username= forms.CharField(label="用戶名") # 括號裏面寫一些校驗規則,下面會介紹 password = forms.CharField(label="密碼") # 類屬性名字是什麽,前端標簽裏面的name值就是什麽, 現在的類屬性就好比input標簽裏面的name=username,name=password
在寫一個視圖函數
def register(request):
form_obj = RegForm()
# print(request.POST)
if request.method == "POST":
# 實例化form對象的時候, 把post提交過來的數據直接傳進去
form_obj = RegForm(data=request.POST) # 就好比request.POST.get(‘username‘) request.POST.get(‘password‘)
# print(form_obj.is_valid()) # 如果用戶輸入的有一個錯誤就是False,全對才是True
if form_obj.is_valid():
print(form_obj.cleaned_data) # 打印用戶輸入對的數據 這個清洗後的數據必須寫在is_valid後面
# else:
# print(form_obj.errors.as_data()) # 拿錯誤信息
return render(request, ‘register.html‘, {‘form_obj‘:form_obj})
else:
return render(request, ‘register.html‘, {‘form_obj‘: form_obj})
register.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--bootstrap-->
<link href="{% static ‘bootstrap/css/bootstrap.min.css‘ %}" rel="stylesheet">
</head>
<body>
<form action="{% url ‘register‘ %}" method="post" novalidate>
{% csrf_token %}
{# <p>{{ form_obj.as_p }}</p>#} <!--拿所有的標簽-->
<p>
{{ form_obj.username.label }}
{{ form_obj.username }}
<span style="color: red">
{{ form_obj.username.errors.0 }} <!--拿錯誤信息,errors拿到的是列表.所以用索引-->
</span>
</p>
<p>
{{ form_obj.password.label }}
{{ form_obj.password }}
<span style="color: red">
{{ form_obj.password.errors.0 }}
</span>
</p>
<p>
{{ form_obj.re_password.label }}
{{ form_obj.re_password }}
{{ form_obj.re_password.errors.0 }}
</p>
<p>
{{ form_obj.userinfo.label }} <!--由於是標簽所以想要顯示作者名字不能直接.name 要在models裏面寫def__str__(self)-->
{{ form_obj.userinfo }}
{{ form_obj.userinfo.errors.0 }}
</p>
<button class="btn btn-primary btn-lg btn-block">註 冊</button>
</form>
</body>
</html>
二 . form表單的常用字段插件
initial
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用戶名",
initial="張三" # 設置默認值
)
pwd = forms.CharField(min_length=6, label="密碼")
error_messages(重寫錯誤信息)
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用戶名",
initial="張三",
error_messages={
"required": "不能為空",
"invalid": "格式錯誤",
"min_length": "用戶名最短8位"
}
)
password
class LoginForm(forms.Form): ... pwd = forms.CharField( min_length=6, label="密碼", widget=forms.PasswordInput(attrs={‘class‘: ‘c1‘}, render_value=True) ) # 讓密碼變成密文 # attrs裏面可以設置bootstrap樣式
RadioSelect
class LoginForm(forms.Form):
username = forms.CharField( #其他選擇框或者輸入框,基本都是在這個CharField的基礎上通過插件來搞的
min_length=8,
label="用戶名",
initial="張三",
error_messages={
"required": "不能為空",
"invalid": "格式錯誤",
"min_length": "用戶名最短8位"
}
)
pwd = forms.CharField(min_length=6, label="密碼")
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性別",
initial=3,
widget=forms.RadioSelect() # 後面括號寫不行都行
)
單選Select
class LoginForm(forms.Form):
...
hobby = forms.fields.ChoiceField(
choices=((1, "籃球"), (2, "足球"), (3, "雙色球"), ),
label="愛好",
initial=3,
widget=forms.Select
)
單選checkbox
class LoginForm(forms.Form):
...
keep = forms.fields.ChoiceField(
label="是否記住密碼",
initial="checked",
widget=forms.CheckboxInput
)
多選checkbox
class LoginForm(forms.Form):
...
hobby = forms.fields.MultipleChoiceField(
choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),
label="愛好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple
)
choice字段註意事項
在選擇標簽時, 需要註意choice的選項可以從數據庫中拿, 但是由於是靜態字段, 獲取的值無法實時更新, 需要重寫構造方法從而實現choice實時更新
方式一
from django.forms import Form
from django.forms import widgets
from django.forms import fields
class MyForm(Form):
user = fields.ChoiceField(
# choices=((1, ‘上海‘), (2, ‘北京‘),),
initial=2,
widget=widgets.Select
)
def __init__(self, *args, **kwargs):
super(MyForm,self).__init__(*args, **kwargs)
# self.fields[‘user‘].choices = ((1, ‘上海‘), (2, ‘北京‘),)
# 或
self.fields[‘user‘].choices = models.Classes.objects.all().values_list(‘id‘,‘caption‘)
方式二
from django import forms
from django.forms import fields
from django.forms import models as form_model
class FInfo(forms.Form):
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) # 多選
# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all()) # 單選
三 . Form所有內置字段
Django--Form組件