当前位置: 首页 > news >正文

湖北网站建设价格自动外链网址

湖北网站建设价格,自动外链网址,北京酒店设计公司,百度搜索技巧一.BBS项目介绍 1.项目开发流程 项目立项 ------> 公司高层决定需求调研和分析 ------> 市场人员,技术人员参与 -需求文档说明开发部门开会 ------> 确定项目架构,技术选型,数据库设计UI,UD团队(产品经…

 一.BBS项目介绍

1.项目开发流程

  1. 项目立项  ------>  公司高层决定
  2. 需求调研和分析  ------>  市场人员,技术人员参与
    -需求文档说明
  3. 开发部门开会  ------>  确定项目架构,技术选型,数据库设计
  4. UI,UD团队(产品经理)  --->  原型图  --->  切图  --->  交给前端
  5. 分任务开发
    -前端
    -后端:对着原型图 --->  设计数据库、设计功能
  6. 前后端联调
  7. 提交版本测试
  8. 发布上线

2.BBS项目功能

  1. 注册功能
    -校验
    -ajax注册
    -头像显示和上传
  2. 登录
  3. 首页文章显示
  4. 个人站点
    -显示这个人写的所有文章
    -侧边栏有分类、标签、随笔
  5. 文章详情
  6. 点赞、点踩
  7. 评论
    -根评论
    -子评论
  8. 后台管理
    -查看所有文章
    -删除文章
    -新增文章:xss攻击去除

3.数据库设计

  1. 用户表
            UserInfo --->  扩写auth的user表
  2. 博客表
            Blog  --->  跟用户表做一对一关联
  3. 文章表
            Article
  4. 文章分类表
            Category
  5. 标签表
            Tag
  6. 点赞点踩表
            UpAndDown
  7. 评论表
            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组件

(1)form组件有哪些用处

  1. 快速生成前端页面
  2. 数据校验
  3. 错误处理

(2)如何使用

校验字段功能

以注册功能为例:

# models.pyclass UserInfo(models.Model):name=models.CharField(max_length=32)pwd=models.CharField(max_length=32)email=models.EmailField()
# HTML里<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title></head>
<body><form action="" method="post">{% csrf_token %}<div><label for="user">用户名</label><p><input type="text" name="name" id="name"></p></div><div><label for="pwd">密码</label><p><input type="password" name="pwd" id="pwd"></p></div><div><label for="r_pwd">确认密码</label><p><input type="password" name="r_pwd" id="r_pwd"></p></div><div><label for="email">邮箱</label><p><input type="text" name="email" id="email"></p></div><input type="submit">
</form></body>
</html>
# views.py# forms组件
from django.forms import widgetswid_01=widgets.TextInput(attrs={"class":"form-control"})
wid_02=widgets.PasswordInput(attrs={"class":"form-control"})class UserForm(forms.Form):name=forms.CharField(max_length=32,widget=wid_01)pwd=forms.CharField(max_length=32,widget=wid_02)r_pwd=forms.CharField(max_length=32,widget=wid_02)email=forms.EmailField(widget=wid_01)tel=forms.CharField(max_length=32,widget=wid_01)def register(request):if request.method=="POST":form=UserForm(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")form=UserForm()return render(request,"register.html",locals())
 渲染标签功能

渲染方式一:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!-- 最新版本的 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<h3>注册页面</h3>
<div class="container"><div class="row"><div class="col-md-6 col-lg-offset-3"><form action="" method="post">{% csrf_token %}<div><label for="">用户名</label>{{ form.name }}</div><div><label for="">密码</label>{{ form.pwd }}</div><div><label for="">确认密码</label>{{ form.r_pwd }}</div><div><label for=""> 邮箱</label>{{ form.email }}</div><input type="submit" class="btn btn-default pull-right"></form></div></div>
</div></body>
</html>

渲染方式二:

<form action="" method="post">{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }}</div>{% endfor %}<input type="submit" class="btn btn-default pull-right"></form>

渲染方式三:

<form action="" method="post">{% csrf_token %}{{ form.as_p }}<input type="submit" class="btn btn-default pull-right"></form>
渲染错误信息功能
# views.pydef register(request):if request.method=="POST":form=UserForm(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())form=UserForm()return render(request,"register.html",locals())
# 模板<form action="" method="post" novalidate>{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span></div>{% endfor %}<input type="submit" class="btn btn-default"></form>
组件参数配置
class Ret(Form):name = forms.CharField(max_length=10, min_length=2, label='用户名',error_messages={'required': '该字段不能为空', 'invalid': '格式错误', 'max_length': '太长','min_length': '太短'},widget=widgets.TextInput(attrs={'class':'form-control'}))pwd = forms.CharField(max_length=10, min_length=2, widget=widgets.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):val=self.cleaned_data.get("name")ret=UserInfo.objects.filter(name=val)if not ret:return valelse:raise ValidationError("该用户已注册!")def clean_tel(self):val=self.cleaned_data.get("tel")if len(val)==11:return valelse:raise  ValidationError("手机号格式错误")
全局钩子
def clean(self):pwd=self.cleaned_data.get('pwd')r_pwd=self.cleaned_data.get('r_pwd')if pwd and r_pwd:if pwd==r_pwd:return self.cleaned_dataelse:raise ValidationError('两次密码不一致')else:return self.cleaned_data
pwd_err=my_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):name=forms.CharField(min_length=4,label="用户名",error_messages={"required":"该字段不能为空"},widget=widgets.TextInput(attrs={"class":"form-control"}))pwd=forms.CharField(min_length=4,label="密码",widget=widgets.PasswordInput(attrs={"class":"form-control"}))r_pwd=forms.CharField(min_length=4,label="确认密码",error_messages={"required":"该字段不能为空"},widget=widgets.TextInput(attrs={"class":"form-control"}))email=forms.EmailField(label="邮箱",error_messages={"required":"该字段不能为空","invalid":"格式错误"},widget=widgets.TextInput(attrs={"class":"form-control"}))tel=forms.CharField(label="手机号",widget=widgets.TextInput(attrs={"class":"form-control"}))def clean_name(self):val=self.cleaned_data.get("name")ret=UserInfo.objects.filter(name=val)if not ret:return valelse:raise ValidationError("该用户已注册!")def clean_tel(self):val=self.cleaned_data.get("tel")if len(val)==11:return valelse:raise  ValidationError("手机号格式错误")def clean(self):pwd=self.cleaned_data.get('pwd')r_pwd=self.cleaned_data.get('r_pwd')if pwd and r_pwd:if pwd==r_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.method=="POST":print(request.POST)#form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"})form=UserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致print(form.is_valid()) # 返回布尔值if form.is_valid():print(form.cleaned_data)  # {"name":"yuan","email":"123@qq.com"}else:print(form.cleaned_data)  # {"email":"123@qq.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])errors=form.errors.get("__all__")return render(request,"reg.html",locals())'''form.is_valid()   :返回布尔值form.cleaned_data :{"name":"yuan","email":"123@qq.com"}form.errors       :{"name":[".........."]}'''form=UserForm()return render(request,"reg.html",locals())
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.error{color: red;}</style><!-- 最新版本的 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body><div class="container"><div class="row"><div class="col-md-6 col-lg-offset-3">{#<h3>简单form</h3>#}{##}{##}{#<form action="" method="post" novalidate>#}{#    {% csrf_token %}#}{#    <p>用户名<input type="text" name="name"></p>#}{#    <p>密码 <input type="text" name="pwd"></p>#}{#    <p>确认密码 <input type="text" name="r_pwd"></p>#}{#    <p>邮箱  <input type="text" name="email"></p>#}{#    <p>手机号 <input type="text" name="tel"></p>#}{#    <input type="submit">#}{##}{#</form>#}<hr><h3>forms组件渲染方式1</h3><form action="" method="post" novalidate>{% csrf_token %}<p>{{ form.name.label }}{{ form.name }} <span class="pull-right error">{{ form.name.errors.0 }}</span></p><p>{{ form.pwd.label }}{{ form.pwd }} <span class="pull-right error">{{ form.pwd.errors.0 }}</span></p><p>确认密码{{ form.r_pwd }} <span class="pull-right error">{{ form.r_pwd.errors.0 }}</span><span class="pull-right error">{{ errors.0 }}</span></p><p>邮箱 {{ form.email }} <span class="pull-right error">{{ form.email.errors.0 }}</span></p><p>手机号 {{ form.tel }} <span class="pull-right error">{{ form.tel.errors.0 }}</span></p><input type="submit"></form>{#<h3>forms组件渲染方式2</h3>#}{##}{#<form action="" method="post" novalidate>#}{#     {% csrf_token %}#}{##}{#    {% for field in form %}#}{##}{#        <div>#}{#            <label for="">{{ field.label }}</label>#}{#            {{ field }}#}{#        </div>#}{##}{#    {% endfor %}#}{##}{#     <input type="submit">#}{#</form>#}{##}{#<h3>forms组件渲染方式3</h3>#}{##}{#<form action="" method="post">#}{#     {% csrf_token %}#}{##}{#     {{ form.as_p }}#}{##}{#     <input type="submit">#}{#</form>#}</div></div>
</div></body>
</html>

(3)总结

  • 写一个类,继承forms.Form
  • 在类中写属性和方法
    • 属性:和我们要校验或者自动生成页面的字段一一对应
    • 方法:对字段进行校验:
      • clean_字段名:给单个字段校验
      • clean:给多个字段校验
  • 在视图函数中使用
  • 在模板中使用

form表单中,如果定义了button或input类型是'submit',只要点击就会默认触发form表单的提交,如果我们又写了ajax提交就会触发两次从而导致出现问题


文章转载自:
http://southpaw.hwbf.cn
http://organophosphorous.hwbf.cn
http://supersalt.hwbf.cn
http://undervaluation.hwbf.cn
http://abbreviation.hwbf.cn
http://aphthoid.hwbf.cn
http://figured.hwbf.cn
http://chromogenic.hwbf.cn
http://heilong.hwbf.cn
http://exhumate.hwbf.cn
http://twelvepence.hwbf.cn
http://xxi.hwbf.cn
http://rhino.hwbf.cn
http://exergue.hwbf.cn
http://divinatory.hwbf.cn
http://stowaway.hwbf.cn
http://submatrix.hwbf.cn
http://roadster.hwbf.cn
http://crudity.hwbf.cn
http://talkfest.hwbf.cn
http://haruspex.hwbf.cn
http://thinkable.hwbf.cn
http://dehors.hwbf.cn
http://camberwell.hwbf.cn
http://linebacker.hwbf.cn
http://pbx.hwbf.cn
http://neocene.hwbf.cn
http://donkey.hwbf.cn
http://pecksniffian.hwbf.cn
http://staphylorrhaphy.hwbf.cn
http://metricate.hwbf.cn
http://transshipment.hwbf.cn
http://mucilaginous.hwbf.cn
http://araby.hwbf.cn
http://wuhsi.hwbf.cn
http://traditionally.hwbf.cn
http://infectivity.hwbf.cn
http://cheekybone.hwbf.cn
http://uninfluenced.hwbf.cn
http://whatso.hwbf.cn
http://pidgin.hwbf.cn
http://cassini.hwbf.cn
http://germanely.hwbf.cn
http://underpowered.hwbf.cn
http://polleniferous.hwbf.cn
http://dissuasion.hwbf.cn
http://theroid.hwbf.cn
http://prefer.hwbf.cn
http://disintegration.hwbf.cn
http://extraartistic.hwbf.cn
http://beddy.hwbf.cn
http://gratuity.hwbf.cn
http://inopportune.hwbf.cn
http://ungrave.hwbf.cn
http://fetichism.hwbf.cn
http://astrolithology.hwbf.cn
http://imputatively.hwbf.cn
http://helilift.hwbf.cn
http://cercus.hwbf.cn
http://ostrogoth.hwbf.cn
http://nepotism.hwbf.cn
http://prurience.hwbf.cn
http://abbr.hwbf.cn
http://savant.hwbf.cn
http://globulicidal.hwbf.cn
http://lidice.hwbf.cn
http://sellanders.hwbf.cn
http://malaguena.hwbf.cn
http://missioner.hwbf.cn
http://infective.hwbf.cn
http://luminous.hwbf.cn
http://arioso.hwbf.cn
http://princelet.hwbf.cn
http://fungicidal.hwbf.cn
http://hinder.hwbf.cn
http://volation.hwbf.cn
http://eigenfrequency.hwbf.cn
http://brawly.hwbf.cn
http://anaphoric.hwbf.cn
http://dogrobber.hwbf.cn
http://creedal.hwbf.cn
http://chyack.hwbf.cn
http://woosh.hwbf.cn
http://riometer.hwbf.cn
http://precollege.hwbf.cn
http://appetite.hwbf.cn
http://minah.hwbf.cn
http://neighborly.hwbf.cn
http://opendoc.hwbf.cn
http://malayanize.hwbf.cn
http://rowboat.hwbf.cn
http://depurate.hwbf.cn
http://axotomy.hwbf.cn
http://rollback.hwbf.cn
http://classifiable.hwbf.cn
http://thoughtful.hwbf.cn
http://oppressively.hwbf.cn
http://conceive.hwbf.cn
http://dihydrotestosterone.hwbf.cn
http://cotylosaur.hwbf.cn
http://www.15wanjia.com/news/65964.html

相关文章:

  • 俄语网站开发清远头条新闻
  • 手机网站在线客服今日热搜榜排名最新
  • 搭建网站设计免费网页在线客服系统
  • 网站建设忽悠益阳网络推广
  • 东莞网站建设方案托管软文大全
  • 在线做网站图标微信推广平台怎么做
  • 北京市建设教育协会网站百度官网首页下载
  • 小学生做愛网站漳州seo网站快速排名
  • 网站建设的误区工具
  • 青海省建设厅报名网站响应式网站模板的应用
  • php 网站 下载百度一下主页官网
  • 卖摄影作品的网站网站建设策划书
  • 茂名免费做网站成都seo技术
  • 做写真网站的限度许昌正规网站优化公司
  • 网页传奇挂机脚本泰安seo网络公司
  • 商丘市网站建设推广免费网站或软件
  • 河南高端建设网站目前搜索引擎排名
  • icon psd下载网站app下载推广
  • 上海徐汇网站建设公司策划方案
  • markdown直接做网站文章发布在哪个平台好
  • 医院网站建设台账头条权重查询站长工具
  • 企业网站推广网站徐州seo公司
  • 描述对于营销型网站建设很重要飘红效果更佳成都百度推广公司电话
  • 网站开发建设合同app拉新平台哪个好佣金高
  • 东莞网站网络网络营销课程
  • 赌博网站怎么做西安快速排名优化
  • 成都建站模板公司企业管理培训
  • 商城网站建设招聘建立网站需要什么技术
  • 网络app开发网站建设价格如何推广小程序
  • jeecg 做网站深圳市住房和建设局官网