Django内置form表单和ajax制作注册页面
settings.py
import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'j_tk9_=-$do&e0zih&zn+%=k0z@i8z(g31+j7699v33!fsoiib' # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
] MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] ROOT_URLCONF = 'about_formday71.urls' TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
] WSGI_APPLICATION = 'about_formday71.wsgi.application' # Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
} # Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
] # Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/ # LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^login/', views.login),
url(r'^reg/', views.reg),
url(r'^index/', views.index),
]
forms.py
from django import forms
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from app01.models import GENDER_CHOICES, DEFAULT_GENDER, UserInfo class RegForm(forms.Form):
name = forms.CharField(
max_length=12,
min_length=3,
label='用户名',
widget=forms.widgets.TextInput()
)
password = forms.CharField(
max_length=20,
min_length=6,
label='密码',
widget=forms.widgets.PasswordInput()
)
re_password = forms.CharField(
max_length=20,
min_length=6,
label='确认密码',
widget=forms.widgets.PasswordInput()
)
phone = forms.CharField(
max_length=11,
min_length=11,
label='手机',
widget=forms.widgets.TextInput(),
validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号码格式不正确'), ]
)
email = forms.CharField(
label='邮箱',
widget=forms.widgets.EmailInput(),
validators=[RegexValidator(r'^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$', '邮箱格式不正确'), ]
)
gender = forms.ChoiceField(
label='性别',
widget=forms.widgets.RadioSelect(),
choices=GENDER_CHOICES,
initial=DEFAULT_GENDER,
) # 写一个局部钩子方法,校验用户名是否已被注册
def clean_name(self):
name_value = self.cleaned_data.get('name')
is_exist = UserInfo.objects.filter(name=name_value)
if is_exist:
raise ValidationError('用户名已存在')
else:
return name_value # 写一个局部钩子方法,校验手机号是否已被注册
def clean_phone(self):
phone_value = self.cleaned_data.get('phone')
is_exist = UserInfo.objects.filter(phone=phone_value)
if is_exist:
raise ValidationError('手机号已存在')
else:
return phone_value def clean(self):
# 判断密码和确认密码是否相等
# self.cleaned_data --> 所有经过校验的数据
pwd = self.cleaned_data.get('password')
re_pwd = self.cleaned_data.get('re_password')
if pwd == re_pwd:
# print(self.cleaned_data)
# print('-' * 120)
return self.cleaned_data # 明确返回
else:
self.add_error('re_password', '两次密码不一致')
raise ValidationError('两次密码不一致') def __init__(self, *args, **kwargs):
super(RegForm, self).__init__(*args, **kwargs)
for field in iter(self.fields):
# print(field, type(field))
if field == 'gender':
continue
self.fields[field].widget.attrs.update({
'class': 'form-control'
})
models.py
from django.db import models # Create your models here. GENDER_CHOICES = ((0, '男'), (1, '女'), (2, '保密'))
DEFAULT_GENDER = 2 class UserInfo(models.Model):
name = models.CharField(max_length=12, unique=True)
password = models.CharField(max_length=20)
phone = models.CharField(max_length=11, unique=True)
email = models.EmailField()
gender = models.PositiveIntegerField(choices=GENDER_CHOICES, default=DEFAULT_GENDER) def __str__(self):
return self.name
views.py
from django.shortcuts import render, HttpResponse, redirect
from app01.forms import RegForm
from app01.models import UserInfo
from django.http import JsonResponse
# Create your views here. # 登录
def login(request):
return HttpResponse('login') # 注册
def reg(request):
if request.method == 'POST':
res = {'code': 0}
# 利用post提交的数据实例化form类
form_obj2 = RegForm(request.POST)
# 校验数据的有效性
if form_obj2.is_valid(): # form_obj2.cleaned_data
form_obj2.cleaned_data.pop('re_password')
UserInfo.objects.create(**form_obj2.cleaned_data)
res['url'] = '/login/'
else:
# 数据有问题
res['code'] = 1
res['error_msg'] = form_obj2.errors
return JsonResponse(res) form_obj = RegForm()
# print(locals())
# print('-' * 120)
# return render(request, 'reg.html', locals())
return render(request, 'reg.html', {'form_obj': form_obj}) # 首页
def index(request):
return HttpResponse('index')
reg.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
</head>
<body> <div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="/reg/" method="post" novalidate id="f1">
{% csrf_token %}
{% for field in form_obj %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<span class="help-block"></span>
</div>
{% endfor %}
<div>
<button type="button" id="b1" class="btn btn-success">注册</button>
</div>
</form>
</div>
</div>
</div>
<script src="{% static 'jquery.js' %}"></script>
<script>
$('#b1').click(function () {
// 清除之前的报错提示
var dataObj = {};
$('input').each(function () {
dataObj[$(this).attr('name')] = $(this).val();
});
console.log(dataObj);
// 取到input标签的值
$.ajax({
url: '/reg/',
type: 'post',
data: dataObj,
success: function (res) {
console.log(res);
// 把所有的错误提示信息展示到页面的指定位置
if (res.code === 0){
// 没错
location.href = res.url;
}else {
$.each(res.error_msg, function (k, v) {
// 根据k找到对应的input框,把v中第一个字符串显示出来
$('#id_'+k).next('span').text(v[0]).parent().addClass('has-error');
})
}
}
})
});
// input标签获取焦点之后清除之前的错误提示
$('form input').focus(function () {
$(this).next('span').text('').parent().removeClass('has-error');
})
</script>
</body>
</html>
Django内置form表单和ajax制作注册页面的更多相关文章
- Django框架 之 Form表单和Ajax上传文件
Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...
- 响应式的账号登录界面模板完整代码,内置form表单和js控件
响应式的账号登录界面模板,内置form表单和js控件 <!DOCTYPE html> <html lang="en"><head><met ...
- django项目中form表单和ajax的文件上传功能。
form表单文件上传 路由 # from表单上传 path('formupload/',apply.formupload,name='formupload/'), 方法 # form表单文件上传 de ...
- Django组件之Form表单
一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...
- 第三百一十一节,Django框架,Form表单验证
第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...
- 关于form表单或者Ajax向后台发送数据时,数据格式的探究
最近在做一个资产管理系统项目,其中有一个部分是客户端向服务端发送采集到的数据的,服务端是Django写的,客户端需要用rrequests模块模拟发送请求 假设发送的数据是这样的: data = {'s ...
- form表单的ajax验证2
form表单的ajax验证2: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- laravel中form表单,ajax传值没反应
laravel中form表单,ajax传值没反应时,可能是令牌有问题. form中添加: {{csrf_token()}} ajax中添加: data: {'page': page, '_token' ...
- jQuery实现form表单基于ajax无刷新提交方法详解
本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...
随机推荐
- JavaScrip——简单练习(输出方式,简单表单验证)
<script> //输出方式 document.write(Date());//获取当前时间 document.write(1); document.write("<p& ...
- QQ会员活动运营平台架构设计实践——高效自动化运营
QQ会员活动运营平台(AMS),是QQ会员增值运营业务的重要载体之一,承担海量活动运营的Web系统.在过去四年的时间里,AMS日请求量从200-500万的阶段,一直增长到日请求3-5亿,最高CGI日请 ...
- Linux 高频工具快速教程
全书分为三个部分: 第一部分为基础篇,介绍我们工作中常用的工具的高频用法: 第二部分为进阶篇,介绍的工具更多的适合程序员使用,分为程序构建.程序调试及程序优化: 第三部分是工具参考篇,主要介绍实用工具 ...
- java------守护线程与非守护线程
最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以 ...
- 微软ASP.NET网站部署指南(8):部署Code-Only更新
1. 综述 初始化部署以后,你须要继续维护和更新你的网站.本章节将向你展示一个不包含数据库改变的部署升级流程.(下一章节将展示数据库改变的部署升级流程.) 提醒:假设依据本章节所做的操作出现错误信息 ...
- 还是PHPExcel问题
//设置自动设置宽度,但是对中文不起作用..(中文自动长还在研究当中) $objPHPExcel->getActiveSheet()->getColumnDimension('A')-&g ...
- Visual Studio 32位64位的问题和如何编译32位64位工程的问题
Visual Studio自身没有32位和64位的分别,对于某一个特定的版本只有一个版本安装文件(即不存在32位版本的VS2015安装文件和64位版本的VS2015安装文件) 对于自己开发的工程,编译 ...
- hammer.js移动端手势库
hammer.js 是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove ...
- eclipse 的代码着色插件 --Eclipse Color Theme
Eclipse Color ThemeEclipse自带的背景颜色是白色的,很伤眼睛,故而安装一个颜色和主题插件,来改变代码区域的背景颜色以及关键字的颜色. 网址:http://eclipsecolo ...
- LAMP集群项目四 安装apache、php及其插件
rpm -qa httpd* 查看是否有apache rpm -e httpd-2.2.22.2 卸载该文件,如果不让卸载,则加参数:--nodeps 不做软件中的依赖检查 ./configure ...