Django实现表单验证

yipeiwu_com6年前Python基础

本文实例为大家分享了Django实现表单验证的具体代码,供大家参考,具体内容如下

models.py

class Users(models.Model):
  nickname = models.CharField(max_length=16, null=False, blank=False, unique=True)
  email = models.EmailField(max_length=32, null=False, blank=False, unique=True)
  password = models.CharField(max_length=64, null=False, blank=False)
  head = models.ImageField(default="decault.png")
  age = models.CharField(max_length=3,blank=True,null=True)
  sex = models.CharField(max_length=2, blank=True, null=True)
  isactivate = models.BooleanField(default=False)

  def save(self):
    if not self.password.startswith('pbkdf2_'):
      self.password = make_password(self.password)
    super().save()

form.py

from django import forms
from django.core.exceptions import ValidationError

from user.models import Users

#定义验证器
def nickname_validate(nickname):
  u = Users.objects.filter(nickname=nickname)
  if len(u):
    print(len(u))
    raise ValidationError('用户名已存在')

#定义表单
class RegisterForm(forms.Form):
  nickname = forms.CharField(validators=[nickname_validate],
                label='用户名',
                max_length=16,
                min_length=4,
                required=True,
                widget= forms.TextInput(),
                )

  password = forms.CharField(label='密码',
                max_length=64,
                min_length=6,
                required=True,
                widget=forms.PasswordInput())

  email = forms.EmailField(label='邮箱',
               max_length=32,
               required=True)

  age = forms.CharField(label='年龄',
             max_length=3,
             required=False)

  sex = forms.ChoiceField(label='性别',
              choices = ((0,'男'),(1,'女'),),
              required=False)

view.py

from user.forms import RegisterForm
from user.models import Users

def register(request):
  if request.method == 'POST':
    form = RegisterForm(request.POST)
    if form.is_valid():
      u = Users()
      u.nickname = form.cleaned_data['nickname']
      u.email = form.cleaned_data['email']
      u.password = form.cleaned_data['password']
      u.age = form.cleaned_data['age']
      u.sex = form.cleaned_data['sex']
      u.save()
      return render(request,'user_info.html')
    else:
      return render(request, 'register.html',context={'form':form,'errors': form.errors})
  else:
    form = RegisterForm()
  return render(request,'register.html',context={'form':form})

register.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>注册</title>
</head>
<body>
  <form class="form" action="{% url 'user:register' %}" method="post">
    {% csrf_token %}
    <table>
      {{ form.as_p }}
    </table>
    <button type="submit" class="btn btn-primary btn-block">注册
    </button>
    <input type="hidden" name="next" value="{{ next }}"/>
  </form>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

在Python中处理字符串之ljust()方法的使用简介

 ljust()方法返回字符串左对齐的字符串长度宽度。填充是通过使用指定的fillchar(默认为空格)。如果宽度小于len(s)返回原始字符串。 语法 以下是ljust()方...

python之拟合的实现

python之拟合的实现

一、多项式拟合 多项式拟合的话,用的的是numpy这个库的polyfit这个函数。那么多项式拟合,最简单的当然是,一次多项式拟合了,就是线性回归。直接看代码吧 import nump...

Python cookbook(数据结构与算法)筛选及提取序列中元素的方法

本文实例讲述了Python筛选及提取序列中元素的方法。分享给大家供大家参考,具体如下: 问题:提取出序列中的值或者根据某些标准对序列做删减 解决方案:列表推导式、生成器表达式、使用内建的...

使用python socket分发大文件的实现方法

思路: 使用socket传输文件过程中,如果单次传输每次只能发送一部分数据,如果针对大文件,一次传输肯定是不行的,所以需要我们在传输的时候提前把传输内容的大小先发送给客户端,在客户端循环...

我们为什么要减少Python中循环的使用

我们为什么要减少Python中循环的使用

前言 Python 提供给我们多种编码方式。 在某种程度上,这相当具有包容性。 来自于任何语言的人都可以编写 Python。 然而,学习写一门语言和以最优的方式写一门语言是两件不同...