网站策划的内容包含了什么?,企业设计网站推荐,网站优化检测,珠海企业网站建设费用一.BBS项目介绍
1.项目开发流程 项目立项 ------ 公司高层决定需求调研和分析 ------ 市场人员#xff0c;技术人员参与 -需求文档说明开发部门开会 ------ 确定项目架构#xff0c;技术选型#xff0c;数据库设计UI#xff0c;UD团队#xff08;产品经… 一.BBS项目介绍
1.项目开发流程 项目立项 ------ 公司高层决定需求调研和分析 ------ 市场人员技术人员参与 -需求文档说明开发部门开会 ------ 确定项目架构技术选型数据库设计UIUD团队产品经理 --- 原型图 --- 切图 --- 交给前端分任务开发 -前端 -后端对着原型图 --- 设计数据库、设计功能前后端联调提交版本测试发布上线 2.BBS项目功能 注册功能 -校验 -ajax注册 -头像显示和上传登录首页文章显示个人站点 -显示这个人写的所有文章 -侧边栏有分类、标签、随笔文章详情点赞、点踩评论 -根评论 -子评论后台管理 -查看所有文章 -删除文章 -新增文章xss攻击去除 3.数据库设计 用户表 UserInfo --- 扩写auth的user表博客表 Blog --- 跟用户表做一对一关联文章表 Article文章分类表 Category标签表 Tag点赞点踩表 UpAndDown评论表 Commit 4.数据库关联关系 用户和博客一对一 博客和文章一对多 一个博客下有很多文章关联字段写在文章表里 博客和分类一对多 一个博客下创建多个分类关联字段写在分类表中 博客和标签一对多 一个博客下创建多个标签关联字段写在标签表中 文章和分类一对多 一个文章只能属于一个分类一个分类下有很多文章关联字段写在文章中 文章和标签多对多 一个文章可以有多个标签一个标签下可以有多个文章多对多关系创建中间表 点赞和用户一对多 一个用户可以点很多赞关联字段写在点赞表中 评论和用户一对多 一个用户可以评论多个评论的一条记录只属于一个用户关联字段写在评论表中 文章和点赞一对多 一篇文章可以被点多次但是一个点赞的记录只对应一篇文章关联字段写在点赞表中 文章和评论一对多 一篇文章可以被评论多次但是一个评论的记录只对应一篇文章关联字段写在评论表中 5.创建项目迁移表环境搭建
# 解释器环境中有 djagno 3.2.20# 1 pycharm 创建
# 2 命令创建# 1 国际化
LANGUAGE_CODE zh-hans
TIME_ZONE Asia/Shanghai
USE_I18N True
USE_L10N True
USE_TZ False
# 2 配置了static
STATIC_URL /static/
STATICFILES_DIRS [os.path.join(BASE_DIR, static)]# 3 配置了media
MEDIA_ROOT os.path.join(BASE_DIR, media)
MEDIA_URL /media/# 4 配置了链接mysql
DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: blog,USER: root,PASSWORD: 1234,HOST: 127.0.0.1,PORT: 3306}
}
二.注册功能
1.注册功能基本需求 用户名密码确认密码邮箱手机号头像 2.form组件
1form组件有哪些用处 快速生成前端页面数据校验错误处理 2如何使用
校验字段功能
以注册功能为例
# models.pyclass UserInfo(models.Model):namemodels.CharField(max_length32)pwdmodels.CharField(max_length32)emailmodels.EmailField()# HTML里!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title/head
bodyform action methodpost{% csrf_token %}divlabel foruser用户名/labelpinput typetext namename idname/p/divdivlabel forpwd密码/labelpinput typepassword namepwd idpwd/p/divdivlabel forr_pwd确认密码/labelpinput typepassword namer_pwd idr_pwd/p/divdivlabel foremail邮箱/labelpinput typetext nameemail idemail/p/divinput typesubmit
/form/body
/html# views.py# forms组件
from django.forms import widgetswid_01widgets.TextInput(attrs{class:form-control})
wid_02widgets.PasswordInput(attrs{class:form-control})class UserForm(forms.Form):nameforms.CharField(max_length32,widgetwid_01)pwdforms.CharField(max_length32,widgetwid_02)r_pwdforms.CharField(max_length32,widgetwid_02)emailforms.EmailField(widgetwid_01)telforms.CharField(max_length32,widgetwid_01)def register(request):if request.methodPOST:formUserForm(request.POST)if form.is_valid():print(form.cleaned_data) # 所有干净的字段以及对应的值else:print(form.cleaned_data) #print(form.errors) # ErrorDict : {校验错误的字段:[错误信息,]}print(form.errors.get(name)) # ErrorList [错误信息,]return HttpResponse(OK)formUserForm()return render(request,register.html,locals())渲染标签功能
渲染方式一
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title!-- 最新版本的 Bootstrap 核心 CSS 文件 --link relstylesheet hrefhttps://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css integritysha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4VaPmSTsz/K68vbdEjh4u crossoriginanonymous
/head
body
h3注册页面/h3
div classcontainerdiv classrowdiv classcol-md-6 col-lg-offset-3form action methodpost{% csrf_token %}divlabel for用户名/label{{ form.name }}/divdivlabel for密码/label{{ form.pwd }}/divdivlabel for确认密码/label{{ form.r_pwd }}/divdivlabel for 邮箱/label{{ form.email }}/divinput typesubmit classbtn btn-default pull-right/form/div/div
/div/body
/html渲染方式二
form action methodpost{% csrf_token %}{% for field in form %}divlabel for{{ field.label }}/label{{ field }}/div{% endfor %}input typesubmit classbtn btn-default pull-right/form渲染方式三
form action methodpost{% csrf_token %}{{ form.as_p }}input typesubmit classbtn btn-default pull-right/form渲染错误信息功能
# views.pydef register(request):if request.methodPOST:formUserForm(request.POST)if form.is_valid():print(form.cleaned_data) # 所有干净的字段以及对应的值else:print(form.cleaned_data) #print(form.errors) # ErrorDict : {校验错误的字段:[错误信息,]}print(form.errors.get(name)) # ErrorList [错误信息,]return render(request,register.html,locals())formUserForm()return render(request,register.html,locals())# 模板form action methodpost novalidate{% csrf_token %}{% for field in form %}divlabel for{{ field.label }}/label{{ field }} span classpull-right stylecolor: red{{ field.errors.0 }}/span/div{% endfor %}input typesubmit classbtn btn-default/form组件参数配置
class Ret(Form):name forms.CharField(max_length10, min_length2, label用户名,error_messages{required: 该字段不能为空, invalid: 格式错误, max_length: 太长,min_length: 太短},widgetwidgets.TextInput(attrs{class:form-control}))pwd forms.CharField(max_length10, min_length2, widgetwidgets.PasswordInput(attrs{class:form-control}))email forms.EmailField(label邮箱, error_messages{required: 该字段不能为空, invalid: 格式错误})局部钩子
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
def clean_name(self):valself.cleaned_data.get(name)retUserInfo.objects.filter(nameval)if not ret:return valelse:raise ValidationError(该用户已注册!)def clean_tel(self):valself.cleaned_data.get(tel)if len(val)11:return valelse:raise ValidationError(手机号格式错误)全局钩子
def clean(self):pwdself.cleaned_data.get(pwd)r_pwdself.cleaned_data.get(r_pwd)if pwd and r_pwd:if pwdr_pwd:return self.cleaned_dataelse:raise ValidationError(两次密码不一致)else:return self.cleaned_data
pwd_errmy_form.errors.get(__all__)
from django import formsfrom django.forms import widgets
from app01.models import UserInfofrom django.core.exceptions import NON_FIELD_ERRORS, ValidationErrorclass UserForm(forms.Form):nameforms.CharField(min_length4,label用户名,error_messages{required:该字段不能为空},widgetwidgets.TextInput(attrs{class:form-control}))pwdforms.CharField(min_length4,label密码,widgetwidgets.PasswordInput(attrs{class:form-control}))r_pwdforms.CharField(min_length4,label确认密码,error_messages{required:该字段不能为空},widgetwidgets.TextInput(attrs{class:form-control}))emailforms.EmailField(label邮箱,error_messages{required:该字段不能为空,invalid:格式错误},widgetwidgets.TextInput(attrs{class:form-control}))telforms.CharField(label手机号,widgetwidgets.TextInput(attrs{class:form-control}))def clean_name(self):valself.cleaned_data.get(name)retUserInfo.objects.filter(nameval)if not ret:return valelse:raise ValidationError(该用户已注册!)def clean_tel(self):valself.cleaned_data.get(tel)if len(val)11:return valelse:raise ValidationError(手机号格式错误)def clean(self):pwdself.cleaned_data.get(pwd)r_pwdself.cleaned_data.get(r_pwd)if pwd and r_pwd:if pwdr_pwd:return self.cleaned_dataelse:raise ValidationError(两次密码不一致)else:return self.cleaned_data
from django.shortcuts import render,HttpResponsefrom app01.myforms import *def reg(request):if request.methodPOST:print(request.POST)#formUserForm({name:yu,email:123qq.com,xxxx:alex})formUserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致print(form.is_valid()) # 返回布尔值if form.is_valid():print(form.cleaned_data) # {name:yuan,email:123qq.com}else:print(form.cleaned_data) # {email:123qq.com}# print(form.errors) # {name:[..........]}# print(type(form.errors)) # ErrorDict# print(form.errors.get(name))# print(type(form.errors.get(name))) # ErrorList# print(form.errors.get(name)[0])# 全局钩子错误#print(error,form.errors.get(__all__)[0])errorsform.errors.get(__all__)return render(request,reg.html,locals())form.is_valid() :返回布尔值form.cleaned_data :{name:yuan,email:123qq.com}form.errors :{name:[..........]}formUserForm()return render(request,reg.html,locals())
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/titlestyle.error{color: red;}/style!-- 最新版本的 Bootstrap 核心 CSS 文件 --link relstylesheet hrefhttps://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.cssintegritysha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4VaPmSTsz/K68vbdEjh4u crossoriginanonymous
/head
bodydiv classcontainerdiv classrowdiv classcol-md-6 col-lg-offset-3{#h3简单form/h3#}{##}{##}{#form action methodpost novalidate#}{# {% csrf_token %}#}{# p用户名input typetext namename/p#}{# p密码 input typetext namepwd/p#}{# p确认密码 input typetext namer_pwd/p#}{# p邮箱 input typetext nameemail/p#}{# p手机号 input typetext nametel/p#}{# input typesubmit#}{##}{#/form#}hrh3forms组件渲染方式1/h3form action methodpost novalidate{% csrf_token %}p{{ form.name.label }}{{ form.name }} span classpull-right error{{ form.name.errors.0 }}/span/pp{{ form.pwd.label }}{{ form.pwd }} span classpull-right error{{ form.pwd.errors.0 }}/span/pp确认密码{{ form.r_pwd }} span classpull-right error{{ form.r_pwd.errors.0 }}/spanspan classpull-right error{{ errors.0 }}/span/pp邮箱 {{ form.email }} span classpull-right error{{ form.email.errors.0 }}/span/pp手机号 {{ form.tel }} span classpull-right error{{ form.tel.errors.0 }}/span/pinput typesubmit/form{#h3forms组件渲染方式2/h3#}{##}{#form action methodpost novalidate#}{# {% csrf_token %}#}{##}{# {% for field in form %}#}{##}{# div#}{# label for{{ field.label }}/label#}{# {{ field }}#}{# /div#}{##}{# {% endfor %}#}{##}{# input typesubmit#}{#/form#}{##}{#h3forms组件渲染方式3/h3#}{##}{#form action methodpost#}{# {% csrf_token %}#}{##}{# {{ form.as_p }}#}{##}{# input typesubmit#}{#/form#}/div/div
/div/body
/html3总结 写一个类继承forms.Form在类中写属性和方法 属性和我们要校验或者自动生成页面的字段一一对应方法对字段进行校验 clean_字段名给单个字段校验clean给多个字段校验在视图函数中使用在模板中使用 form表单中如果定义了button或input类型是submit只要点击就会默认触发form表单的提交如果我们又写了ajax提交就会触发两次从而导致出现问题