Djang之ModelForm组件的简单使用

ModelForm组件的简单使用

models.py

from django.db import models

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    email = models.EmailField(max_length=32)
    phone = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

    def __str__(self):
        return self.username

forms.py

import re
from django import forms
from django.forms import widgets as form_widgets
from account.models import UserInfo

class RegisterForm(forms.ModelForm):
    password = forms.CharField(
        min_length=6,max_length=32,
        error_messages={
            'required':'密码不能为空',
            'min_length':'密码长度必须大于6小于32',
            'max_length':'密码长度必须大于6小于32',
        },
        widget=forms.PasswordInput()
    )
    password_confirmed = forms.CharField(
        error_messages={'required':'确认密码不能为空'},
        widget=forms.PasswordInput()
    )
    class Meta:
        model = UserInfo
        fields = '__all__'
        error_messages = {
            'username':{
                'required': '用户名不能为空',
            },
            'email': {
                'required': '邮箱地址不能为空',
                'invalid': '邮箱地址格式错误',
            },
            'phone': {
                'required': '电话号码不能为空',
            },
        }
        widgets = {
            'username':form_widgets.TextInput(),
            'email':form_widgets.EmailInput(),
            'phone':form_widgets.TextInput(),
        }

    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)

    def clean_username(self):
        value = self.cleaned_data['username']
        patten = re.compile(r'^[a-zA-Z0-9.@_]{2,16}$')
        if not patten.match(value):
            raise forms.ValidationError('用户名应该是由大小写字母/数字/特俗符号组成(.@_)的2到16位字符串')
        return value

    def clean_phone(self, ):
        value = self.cleaned_data['phone']
        patten = re.compile(r'^(13[0-9]|14[5-9]|15[0-3,5-9]|16[2,5,6,7]|17[0-8]|18[0-9]|19[1,3,5,8,9])[0-9]{8}$')
        if not patten.match(value):
            raise forms.ValidationError('手机号码格式错误')
        if UserInfo.objects.filter(phone=value).count():
            raise forms.ValidationError('手机号码已经存在')
        return value

    def clean(self):
        password = self.cleaned_data.get("password")
        password_confirmed = self.cleaned_data.get("password_confirmed")
        if password != password_confirmed:
            self.add_error('password_confirmed', forms.ValidationError('密码不一致'))
            return self.cleaned_data
        return self.cleaned_data

views.py

from django.shortcuts import render
from django.views import View
from account.forms import RegisterForm
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse


class RegisterView(View):
    def get(self,request):
        context = { 'form':RegisterForm() }
        return render(request, 'register.html', context)
    def post(self,request):
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect(reverse('account:index'))
        return render(request, 'register.html', {'form':form})

class IndexView(View):
    def get(self,request):
        return render(request,'index.html')

register.html

{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form method="POST" novalidate>
    {% csrf_token %}
    <p> 用户名:{{ form.username }} {{ form.errors.username.0 }} </p>
    <p> 密码:{{ form.password }} {{ form.errors.password.0 }} </p>
    <p> 确认密码:{{ form.password_confirmed }} {{ form.errors.password_confirmed.0 }} </p>
    <p> 邮箱:{{ form.email }} {{ form.errors.email.0 }}</p>
    <p> 手机:{{ form.phone }} {{ form.errors.phone.0 }}</p>
    <input type="submit" value="提交" />
</form>

</body>
</html>

  

 

posted @ 2019-09-09 17:17  青山应回首  阅读(246)  评论(0编辑  收藏  举报