zoukankan      html  css  js  c++  java
  • django入门到精通⑨forms表单的使用

    django入门到精通⑨forms表单的使用


    (python37_django2) D:pythondjango_imooc_xiaobaipython manager.py startproject forms
    (python37_django2) D:pythondjango_imooc_xiaobaipython manager.py startapp app

    1.创建forms数据库

    MariaDB [(none)]> create database forms;


    setttings.py 添加数据库配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'forms',
            'USER': 'root',
            'PASSWORD': 'root',
            'HOST': '127.0.0.1',
            'PORT': '3306'
        }
    }

    定义models

    app/models.py

    # coding:utf-8
    
    from django.db import models
    
    
    class Auth(models.Model):
        username = models.CharField(max_length=18)
        password = models.CharField(max_length=18)
    
        def __ser__(self):
            return 'username:{}'.format(self.username)

    同步数据库

    (python37_django2) D:pythondjango_imooc_xiaobaiform>python manage.py makemigrations
    (python37_django2) D:pythondjango_imooc_xiaobaiform>python manage.py migrate


    2.前端注册页面
    templates/regist.html

    <!DOCTYPE html>
    <html lang="en" xmlns="http://www.w3.org/1999/html">
    <head>
        <meta charset="UTF-8">
        <title>regist</title>
    </head>
    <body>
    
    <form action="{% url 'regist' %}" method="POST">
        {% csrf_token %}
        {% for item in form %}
            <label for="{{ item.id_for_label }}">{{ item.label }}</label>
            {{ item }}
            <p>{{ item.errors.as_text }}</p>
        {% endfor %}
        <span>{{ form.not_field_errors.as_text }}</span> <br>
        <!--
        <label>用户名</label><input type="text" name="username" placeholder="用户名"> <br/>
        <label>密码</label><input type="password" name="password" placeholder="密码"> <br/>
        -->
        <input type="submit" value="提交">
    </form>
    
    </body>
    </html>

    3.定义app/forms 对字段进行验证

    app/forms.py

    # _*_ coding:utf-8 _*_
    # __author__ == 'jack'
    # __date__ == '2021-01-19 8:51 PM'
    
    from django import forms
    from django.forms import fields
    from .models import Auth as AuthModel
    
    
    class AuthModelForm(forms.ModelForm):
        class Meta:
            model = AuthModel
    
            fields = ['username', 'password']
            exclude = []
    
            field_classes = {
                'username': forms.CharField,
                'password': forms.CharField
            }
    
            labels = {
                'username': '用户名',
                'password': '密码'
            }
    
            widgets = {
                'username': forms.TextInput(
                    attrs = {'placeholder':'请输入用户名'}
                ),
                'password': forms.PasswordInput(
                    attrs={'placeholder': '请输入密码'},
                    render_value=True
                )
            }
    
            error_messages = {
                'username': {'required': '用户名不可以为空'},
                'password': {'min_length': '最少不能小于3个字符'}
            }
    
    
    class Auth(forms.Form):
        username = fields.CharField(
            max_length=18,
            min_length=3,
            required=True,
            label="用户名",
            widget=forms.TextInput(attrs={'placeholder':'最大不可超过18字符'}),
            error_messages={'max_length': '最大不能超过18个字符'}
        )
        password = fields.CharField(
            widget=forms.PasswordInput,
            label="密码",
            required=True,
            min_length=10,
            error_messages={'min_length': '最小不能低于10个字符'}
        )
    
        def clean(self):
            password = self.cleaned_data.get('password','')
            if not password:
                raise forms.ValidationError('密码不能为空')
    
        def clean_username(self):
            username = self.cleaned_data.get('username', '')
            if not username:
                raise forms.ValidationError('用户名不能为空')
    
            if len(username) > 10:
                raise forms.ValidationError('用户名长度不能超过10')
    
            return username

    4.路由的定义
    app/urls.py

    # _*_ coding:utf-8 _*_
    # __author__ == 'jack'
    # __date__ == '2021-01-19 8:30 PM'
    
    
    from django.urls import path
    from .views import Regist
    
    urlpatterns = [
        path('regist', Regist.as_view(), name='regist')
    ]

    总路由
    form/urls.py

    from django.contrib import admin
    from django.urls import path, include
    from app import urls as app_urls
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include(app_urls)),
    ]

    5.视图的定义
    app/views.py

    # coding:utf-8
    from django.shortcuts import render,redirect
    from django.views.generic import View
    from .forms import Auth
    from .forms import AuthModelForm
    
    
    class Regist(View):
        TEMPLATE = "regist.html"
    
        def get(self, request):
            form = Auth()
            return render(request,self.TEMPLATE, {'form':form})
    
        def post(self, request):
    
            # username = request.POST.get('username')
            # password = request.POST.get('password')
    
            # form = Auth(request.POST)
            form = AuthModelForm(request.POST)
    
            if form.is_valid():
                # username = form['username']
                # password = form['password']
    
                username = form.cleaned_data.get('username')
                password = form.cleaned_data.get('password')
    
                print("username = ", username)
                print("password = ", password)
    
                form.save()
            else:
                return render(request, self.TEMPLATE, {'form':form})
    
            return redirect("/regist")

    测试


    json和str之间的格式转换

    In [1]: import json

    In [2]: data={"name":"jack","age":30}

    In [3]: str(data)
    Out[3]: "{'name': 'jack', 'age': 30}"

    In [4]: res = json.dumps(data)

    In [5]: res
    # 可以看到json格式{} 里面是 " " 双引号
    Out[5]: '{"name": "jack", "age": 30}'

    In [6]: json.loads(res)
    Out[6]: {'name': 'jack', 'age': 30}

  • 相关阅读:
    Python全栈 MySQL 数据库 (表字段增、删、改、查、函数)
    Python全栈 MySQL 数据库 (简述 、安装、基本命令)
    Python全栈工程师(异常(高级)、运算符重载)
    Python全栈工程师(多继承、函数重写)
    【洛谷P3796】(模板)AC自动机(加强版)
    【洛谷P3808】(模板)AC自动机(简单版)
    【洛谷P3919】(模板)可持久化数组(可持久化线段树/平衡树)
    【洛谷P3834】(模板)可持久化线段树 1(主席树)
    【洛谷P3369】(模板)普通平衡树
    [USACO12FEB]牛券Cow Coupons
  • 原文地址:https://www.cnblogs.com/reblue520/p/14315187.html
Copyright © 2011-2022 走看看