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}

原文地址:https://www.cnblogs.com/reblue520/p/14315187.html