基于forms组件和Ajax实现注册功能

1 基于forms组件设计注册页面

  --点击头像 === 点击input

  --头像预览:

    修改用户选中的文件对象;获取文件对象的路径;修改img的src属性,src=文件对象路径。

2.错误信息:

  views:

    forms.errors # {"user":[......] }

 Ajax.success:
$.each(data.msg, function(field, error_list){
$("#id_"+field).next().html(error_list[0]); //每次循环都把各自的信息放到input那下面了
$("#id_"+field).parent().addClass("has-error");
})

3.局部钩子和全局钩子校验

  user字段不能重复

  两次密码不能一致

4.FileField(可以上传任何文件)与ImageFiled(只能上传图片)

class UserInfo(AbstractUser):  #用户认证组件,要用用户表;扩展字段,继承AbstractUser类,
'''用户信息'''
nid = models.AutoField(primary_key=True)
telephone = models.CharField(max_length=11, null=True, unique=True) #这些字段接收一个字符串就可以了
avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png") #而它一定要接收一个文件对象
avatar_obj = request.FILES.get("avatar")
user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj)#这里avatar一定要接收一个文件对象
Django会实现:
  会将文件对象下载到项目的根目录中avatars文件夹中(如果没有avatar文件夹,Django会自动创建),user_obj的avatar存的是文件的相对路径。

views.py

def register(request):
if request.is_ajax(): #你点击那个按钮即使Ajax请求又是post请求。既可以用Ajax也可用method=post作分支判断
print(request.POST) #把所有提交的数据都取出来
form = UserForm(request.POST) #用UserForm做检验,
response = {"user":None, "msg":None} #发Ajax一般都会返回一个字典来进行标示这些行为
if form.is_valid(): #数据全通过,成功
response["user"] = form.cleaned_data.get("user") #注册人的名字 #要生成一条用户纪录
user = form.cleaned_data.get("user") #print(“user”,user)
pwd = form.cleaned_data.get("pwd")
email = form.cleaned_data.get("email")
avatar_obj = request.FILES.get("avatar")
user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj) else:
print(form.cleaned_data) #干净数据
print(form.errors) #错误数据
response["msg"] = form.errors #失败了之后把这所有的错误信息放到msg里边
return JsonResponse(response)
form = UserForm()
return render(request,"register.html", {"form":form})

5. Media配置之MEDIA_ROOT

Django有两种静态文件:

  /static/   :js,css,img

  /media/   :用户上传文件;  用户默认头像图片应该在media/avatar里边存一份。

class UserInfo(AbstractUser): 
'''用户信息'''
nid = models.AutoField(primary_key=True)
telephone = models.CharField(max_length=11, null=True, unique=True)
avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png")
avatar_obj = request.FILES.get("avatar")
user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj)

用户一旦配置了

MEDIA_ROOT = os.path.join(BASE_DIR, "media") 这个路径(在settings里边)
Django会实现:
  会将文件对象下载到MEDIA_ROOT中avatars文件夹中(如果没有avatar文件夹,Django会自动创建),user_obj的avatar存的是文件的相对路径。

settings.py

STATIC_URL = '/static/'

STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static")
] MEDIA_ROOT = os.path.join(BASE_DIR, "media")

views.py

def register(request):
'''
#把下面打印的注释应该写在这里边来
:param request:
:return:
'''
if request.is_ajax(): # 你点击那个按钮即使Ajax请求又是post请求。既可以用Ajax也可用method=post作分支判断
# print(request.POST) #把所有提交的数据都取出来
form = UserForm(request.POST) # 用UserForm做检验,
response = {"user": None, "msg": None} # 发Ajax一般都会返回一个字典来进行标示这些行为
if form.is_valid(): # 数据全通过,成功
response["user"] = form.cleaned_data.get("user") # 注册人的名字 # 生成一条用户纪录
user = form.cleaned_data.get("user")
# print("user", user)
pwd = form.cleaned_data.get("pwd")
email = form.cleaned_data.get("email")
avatar_obj = request.FILES.get("avatar")
extra = {} # 代码的优化,使用字典
if avatar_obj:
extra["avatar"] = avatar_obj
UserInfo.objects.create_user(username=user, password=pwd, email=email, **extra)
# if avatar_obj: #如果上传了头像 ---->> else是没有上传 就是默认头像了。
# user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj)
# else:
# user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email)
else:
print(form.cleaned_data) # 干净数据
print(form.errors) # 错误数据
response["msg"] = form.errors # 失败了之后把这所有的错误信息放到msg里边
return JsonResponse(response)
form = UserForm()
return render(request, "register.html", {"form": form})

6. Media配置之MEDIA_URL

访问http://127.0.0.1:8000/static/blog/img/default.png是可以直接访问到的,如果是http://127.0.0.1:8000/blog/views.py/是访问不到的,不能把你的源代码暴露出来啊,static里边的无所谓,而static是Django给你配置好的,应该让用户看到。同样的media里边应该也让用户看到。  浏览器如何能直接访问到media中的数据呢?

settings.py

MEDIA_URL = '/media/'
#与用户上传相关的配置
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/'

urls.py

#media配置
re_path(r"media/(?P<path>.*)$", serve, {"document_root":settings.MEDIA_ROOT})

浏览器访问http://127.0.0.1:8000/media/avatars/11.jpg可以直接访问media里边的文件了

注意规范问题:

2.2博客系统 |FileField字段 |Media配置的更多相关文章

  1. 【django之博客系统开发】

    一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...

  2. web开发-Django博客系统

    项目界面图片预览 项目代码github地址 项目完整流程 项目流程: 1 搞清楚需求(产品经理) (1) 基于用户认证组件和Ajax实现登录验证(图片验证码) (2) 基于forms组件和Ajax实现 ...

  3. form表单使用(博客系统的登陆验证,注册)

    先从小的实例来看form的用法 登陆验证实例,来看form的常规用法 1. forms.py # 用于登陆验证验证 from django.core.validators import RegexVa ...

  4. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

    一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...

  5. 从零开始,搭建博客系统MVC5+EF6搭建框架(4)下,前后台布局实现、发布博客以及展示。

    一.博客系统进度回顾 目前已经完成了,前台展示,以及后台发布的功能,最近都在做这个,其实我在国庆的时候就可以弄完的,但是每天自己弄,突然最后国庆2天,连电脑都不想碰,所以就一直拖着,上一篇写了前端实现 ...

  6. 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑

    前言      从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章 ...

  7. 基于SAE+CodeIgniter3.0+管理端angularjs+前台amazeui的多用户博客系统V1.0--系统设计(一)

    开发环境: 服务器系统:CentOS-6.x web服务器:Apache-2.2.x php版本:PHP-5.3.x 开发工具:sublime text 3 ,谷歌浏览器 数据库查询工具:phpmya ...

  8. Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置

    Django后台一般是不需要人为的去开发的,因为django已经通过配置实现哪些模块是后台需要管理,如何排序,列表展示哪些列,列显示名称,是否为空(默认值),过滤条件,分页页数,列表中哪些项可编辑等等 ...

  9. Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中

    背景: 之前也读过一些关于django的一些书,看过别人写的一些博客系统.但是总有一种看别人的都会,但自己写不出来的感觉,于是为了加深对django的学习就开始动手学习了. 环境搭建: 环境:使用py ...

随机推荐

  1. SNMP收集

    http://velep.com/archives/416.html     协议基本格式

  2. POJ3177 Redundant Paths【双连通分量】

    题意: 有F个牧场,1<=F<=5000,现在一个牧群经常需要从一个牧场迁移到另一个牧场.奶牛们已经厌烦老是走同一条路,所以有必要再新修几条路,这样它们从一个牧场迁移到另一个牧场时总是可以 ...

  3. C - Portals Gym - 102006C (网络流最小割)

    题目链接:https://cn.vjudge.net/contest/283918#problem/C 题目大意:T个测试数据,然后给你一个字符串,每一个字符串包括‘s’,‘t’,‘o’,‘#’,‘. ...

  4. ResNet152网络复现(Caffe)

    一.准备数据集 1)  下载数据集 Imagnet网站上下载了三类图片,分别是big cat.dog.fish,其中训练集的图片数一共是4149,测试集的图片数是1003,训练集和测试集的图片数比例4 ...

  5. SciPy模块应用

    1.图像模糊  图像的高斯模糊是非常经典的图像卷积例子.本质上,图像模糊就是将(灰度)图像I 和一个高斯核进行卷积操作:,其中是标准差为σ的二维高斯核.高斯模糊通常是其他图像处理操作的一部分,比如图像 ...

  6. 无责任共享 Coursera、Udacity 等课程视频(转载)

    转载链接:https://www.zybuluo.com/illuz/note/71868 B站计划:https://www.zybuluo.com/illuz/note/832995#cs基础课程

  7. linux命令 dirname

    功能: 获取给定路径的目录部分 利用man 查看dirname的说明如下: DESCRIPTION        Output each NAME with its last non-slash co ...

  8. KVM -> 虚拟机磁盘管理_03

    1.KVM磁盘管理 1.KVM qcow2.raw.vmdk等镜像格式说明:http://blog.csdn.net/zhengmx100/article/details/53887162 raw: ...

  9. 将本地光盘做成yum源

    环境:vmware 1.将centos6.5光盘挂载在虚拟机上 2.将光盘挂载在/mnt/cdrom目录下 root#  mkdir /mnt/cdrom root # mount /mnt/cdro ...

  10. python语法小应用---列表和元组

    声明:本文章为参考总结CSDN上知识点所获,只是用来总结自己学习而用,如有侵权,会删除! 列表(list): 列表就像一个线性容器,但是比C++的 lis t扩展多得多 列表里的元素可以是相同类型,也 ...