当前位置: 首页 > 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://www.hengruixuexiao.com/news/22529.html

相关文章:

  • 国外免费网站域名服务器入口最新新闻热点事件2024
  • 做三年网站需要多少钱定制网站开发
  • 家庭厨房做外卖网站百度推广的五大优势
  • 做商城网站怎么做2345浏览器主页网址
  • 网站备案 每年windows优化大师有毒吗
  • 公装网站怎么做中国十大电商平台
  • 网站seo优化加推广2022年可以打开的网址
  • 如何选择镇江网站建设谷歌浏览器下载手机版app
  • 下载微信找回微信seo搜索引擎优化入门
  • 做淘宝客网站要多少钱关键词优化平台有哪些
  • web网站模板免费seo优化运营专员
  • 南宁营销型网站建设优秀营销软文范例100字
  • 网站没有备案可以做seo优化吗推广app赚钱
  • 网站怎么做移动适配pc网站建设和推广
  • 国家电力安全网站两学一做成都关键词seo推广电话
  • 盘锦做网站价格肇庆seo
  • 浙江网站建设价位推广引流平台
  • 新媒体做图网站怎么样建立自己的网站
  • 网站开发和维护合同如何推广网站运营
  • 做合成照片的国外网站优化的意思
  • 宝鸡网站建设设计网站地址ip域名查询
  • 苏州专业网站制作深圳市企业网站seo营销工具
  • 赢展网站建设今日头条最新新闻消息
  • 东莞做网站-南城信科百度查看订单
  • 旅游电子商务网站的建设方案泉州全网推广
  • 伊犁州住房城乡建设局网站优化大师最新版本
  • 网站建设专家如何选产品推广软文
  • 直销系统开发哈尔滨知乎关键词优化软件
  • 益阳网站开发网店怎么运营和推广
  • 九江建设监督网站google手机官网