Django+JS 实现点击头像即可更改头像的方法示例


Posted in Python onDecember 26, 2018

首先,在models.py中创建UserModels类

from django.db import models
from django.contrib.auth.models import AbstractUser


class UserModels(AbstractUser):
  nickname = models.CharField(max_length=50, null=True, verbose_name='用户昵称')
  mobile = models.CharField(max_length=11, null=True, verbose_name='电话')
  address = models.CharField(max_length=100, null=True, verbose_name='住址')
  sex = models.CharField(max_length=10, null=True, verbose_name='性别')
  head_img = models.ImageField(upload_to='%Y/%m', verbose_name='头像', null=True)

  class Meta:
    db_table = 'user'
    verbose_name = '用户'
    verbose_name_plural = verbose_name

想要显示在admin后台,则必须在admin.py文件中注册

from django.contrib import admin
from .models import UserModels

admin.site.register(UserModels)

然后,在settings.py中,

AUTH_USER_MODEL = 'customuser.UserModels'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/images')

之后,python manage.py makemigrations

python manage.py migrate进行同步到数据库

然后,也就开始实现头像的更换

在urls.py中绑定路由:

path('info/', TemplateView.as_view(template_name='user/userinfo.html'), name='user_info'),
 path('headimg/', headimg, name='user_img'),

在userinfo.html中:

html部分:

form action="#" method="post">
    {% csrf_token %}
  </form>
  <div class="header">
    <div class="container">
      <h2>个人信息</h2>
    </div>
  </div>
  <div class="container">
    <dl>
      <dt>头像</dt>
      <dd id="file">
        <img src="/static/images/{{ request.user.head_img }}" alt="" style="border-radius: 50%; width: 100px;height: 100px;" id="img-show">
        {# input type="file" 这种标签,该标签自带的就有click事件。type='text'这种类型就没有点击事件。 #}
        <input type="file" id="img-upload" style="display: none;" onchange="uploadimg()">
      </dd>

      <dt>昵称:</dt>
      <dd>{{ request.user.nickname }}</dd>
      <dt>电话:</dt>
      <dd>{{ request.user.mobile }}</dd>
      <dt>住址:</dt>
      <dd>{{ request.user.address }}</dd>
      <dt>性别:</dt>
      <dd>{{ request.user.sex }}</dd>
      <dt>个人简介:</dt>
      <dd>主人很懒,什么也没有留下。</dd>
    </dl>
    <a href="{% url 'user_update' %}" rel="external nofollow" >编辑个人资料</a>
    <hr>
  </div>

js部分:

{# 点击头像图片,触发<input type="file">这个标签的click事件。#}
  <script>
    $(document).ready(function(){
      {# ready事件,指整个html文档渲染完成以后,自动执行的操作。 #}
      {# 自动执行什么操作?给img标签绑定click事件。 onclick=""; .addEventLisenter("click", function(){}); $().click(); #}
      $('#img-show').click(function () {
        {# 只要点击Img,就会触发匿名函数的调用。 #}
        {# 点击图片。触发input的点击事件。 #}
        $('#img-upload').click();
      })
    });
    function uploadimg() {
      {#alert('你切换图片了');#}
      {# 主要工作:获取选择的图片内容,读取内容,并将这个图片保存在图像上。 #}
      {# files: 这个属性就是用来获取input所选择的内容。files[0]就是一个File对象,包含文件的名称、文件的大小、文件的类型等信息。 #}
      var img_file = $('#img-upload')[0].files[0];

      {# 从文件对象img_file中读取图片内容,首先要创建一个文件读取器。 #}
      var reader_file = new FileReader();
      {# 开始利用文件读取器从img_file中读取内容 #}
      reader_file.readAsDataURL(img_file);
      {# 等图片读取完成,reader_file有一个读取成功的自动调用的回调事件 #}
      reader_file.onload = function (ev) {
        $('#img-show').attr('src', ev.target.result);
        {# 页面完成头像修改以后,需要将用户在数据库中保存的头像路径也进行修改。需要在views.py中修改用户的head_img值。 #}
        {# ajax上传图片文件到django后台:如何使用ajax请求将图片传给django后台的View。 #}
        var formdata = new FormData();
        formdata.append('img_name', img_file.name);
        formdata.append('img_file', img_file);
        {# 构造表单对象,类似于<form>标签。 #}
        {# 如果使用ajax发送POST请求,要求携带的参数里面,必须带有csrf这个随机字符串。和<form>的验证原理是一样的。<input type="hidden" name="csrfmiddlewaretoken" value="nzssW2AKQg4OOth2xmYYCYQuPFEAxhkcNPW3wwLQX6CKm8LkWhusgsowh2IcARSN"> #}
        formdata.append('csrfmiddlewaretoken', '{{ csrf_token }}');
        $.ajax({
          url: '{% url 'user_img' %}',
          type: 'POST',
          data: formdata,
          {# processData:默认值是True,含义就是jQuery会对参数进行编码,让其转化为一个查询字符串。如果为FALSE,意思就是不需要jQuery对data: formdata这个数据做任何处理。 #}
          {# 查询字符串:一般出现在GET请求中,username='123'&password='456' #}
          processData: false,
          {# contentType: 该字段指的是此次请求携带的数据是什么累心数据。字段的默认值application/x-www-form-urlencoded。把它的值设置false,目的就是希望不使用默认的值对formdata进行转换。 #}
          contentType: false,
          success: function(data, status) {
            alert(data);
          }
        });
        {# 1. ajax上传文件(图片、文件、音频)需要使用POST请求; #}
        {# 2. 需要将传给后台的数据,保存在FormData()表单对象中; #}
        {# 3. POST请求需要携带cstf,ajax请求和<form>请求携带方式不一样; #}
        {# 4. ajax上传文件的POST请求,需要指定两个参数:processData: false;contentType: false;#}
      }
    }
  </script>

在views.py中完善函数:

def headimg(request):
  if request.method == 'POST':
    # 前端ajax请求,将图片对象、图片名称传递到了后台的views.py中;
    img = request.FILES.get('img_file')
    # 获取数据库head_img字段的值,并切割成列表。
    # ['2018', '10', 'h2.png']
    path = request.user.head_img.url.split('/')
    # 将列表的最后一个元素图片名称,替换成新的图片名称
    path[-1] = request.POST.get('img_name')
    # 再将列表合成一个字符串
    path = '/'.join(path)

    url = settings.MEDIA_ROOT + '/' + path

    # 将ajax传过来的图片写入到本地/static/images/....目录下。
    with open(url, 'wb') as f:
      for chunk in img.chunks():
        f.write(chunk)

    # 以上步骤实现了图片的后台保存,还需要修改当前用户数据库中的头像路径。
    request.user.head_img = path
    request.user.save()

    return HttpResponse('图片上传成功')

写完之后,我们就可以测试效果了:

首先,creatsuperuser 一个用户名:admin 密码:admin12345

之后,使用admin登录admin后台,在创建两个普通用户,分别设置一个图片作为头像

Django+JS 实现点击头像即可更改头像的方法示例

Django+JS 实现点击头像即可更改头像的方法示例

创建普通用户之后,使用其中一个test进行登录项目首页:

注意:使用admin后台创建的用户,密码是没有加密的,所以,在设置登录这一方便要注意你检测的是加密密码,还是不是加密密码。

在这里,我设置的test和test1的密码都是和admin的密码一样,那么在登录test的时候,

Django+JS 实现点击头像即可更改头像的方法示例

只需要,将admin的加密密码,粘贴到test和test1的密码中。保存。之后,使用test 密码admin12345进行登录

Django+JS 实现点击头像即可更改头像的方法示例

登录成功之后,

来到修改资料页面:

Django+JS 实现点击头像即可更改头像的方法示例

当点击头像的时候,就会让选择新头像:

Django+JS 实现点击头像即可更改头像的方法示例

选择你的新头像:即上传成功

Django+JS 实现点击头像即可更改头像的方法示例

之后,再访问资料页面,就展示的是新头像了

Django+JS 实现点击头像即可更改头像的方法示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python根据区号生成手机号码的方法
Jul 08 Python
3个用于数据科学的顶级Python库
Sep 29 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
Pyspark获取并处理RDD数据代码实例
Mar 27 Python
Django静态资源部署404问题解决方案
May 11 Python
python2和python3哪个使用率高
Jun 23 Python
8种常用的Python工具
Aug 05 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
Django与数据库交互的实现
Jun 03 Python
Python使用requests提交HTTP表单的方法
Dec 26 #Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 #Python
python http基本验证方法
Dec 26 #Python
python url 参数修改方法
Dec 26 #Python
在python中使用xlrd获取合并单元格的方法
Dec 26 #Python
python+opencv实现高斯平滑滤波
Jul 21 #Python
python+opencv实现阈值分割
Dec 26 #Python
You might like
我的论坛源代码(九)
2006/10/09 PHP
15种PHP Encoder的比较
2007/03/06 PHP
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
js常用函数 不错
2006/09/08 Javascript
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
TensorFlow实现创建分类器
2018/02/06 Python
python二进制文件的转译详解
2019/07/03 Python
python datetime中strptime用法详解
2019/08/29 Python
python logging日志模块原理及操作解析
2019/10/12 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
python常用排序算法的实现代码
2019/11/08 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
2015最新婚礼主持词
2015/06/30 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android