day11ジャンゴ:fromsコンポーネント:データのリセットカスタムルールデータをレンダリングデータのチェックサム・エラー・メッセージ

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
 
 
 
 
 
 
 
 

おすすめ

転載: www.cnblogs.com/aiaii/p/12403892.html