時間:2023-04-30 05:09:02 | 來源:網(wǎng)站運營
時間:2023-04-30 05:09:02 來源:網(wǎng)站運營
網(wǎng)站添加用戶頭像功能(基于Django框架):ImageField
字段來上傳圖像作為頭像,但是之后覺得這樣比較麻煩,因為這樣每次上傳的圖片都會堆積在服務器,會對服務器造成一定的壓力,而且還需要對上傳的圖片進行命名的處理,否則可能會造成同樣名稱的文件相互覆蓋,所以最后我打算不使用這種方法,而是將用戶的上傳的圖像進行base64編碼,然后使用TextField
來保存對應的編碼,這樣不僅避免圖片在服務器堆積,而且可以提高頭像的加載速度。from django.db import modelsfrom django.contrib.auth.models import User# Create your models here.# 創(chuàng)建一個新的模型,通過外鍵關聯(lián)到User這個模型,從而對User進行定義class Add_User_Info(models.Model): # 通過外鍵關聯(lián)User user = models.OneToOneField(User, on_delete=models.CASCADE) user_img_base64 = models.TextField(default='')def get_user_img(self): if Add_User_Info.objects.filter(user=self).exists(): return Add_User_Info.objects.get(user=self).user_img_base64 else: return ''User.get_user_img = get_user_img
這里還定義了方法get_user_img
,是為了能夠直接通過User.get_user_img()
來得到user_img_base64
字段的內(nèi)容,而不是通過Add_User_Info
這個字段來間接查詢到。{% extends 'new_siwei.html' %}{% load staticfiles %}{% block hea %}<title>{{ title }}</title><link rel="stylesheet" type="text/css" href="/static/CSS/font-awesome.4.6.0.css"><link rel="stylesheet" href="/static/CSS/amazeui.min.css"><link rel="stylesheet" href="/static/CSS/amazeui.cropper.css"><link rel="stylesheet" href="/static/CSS/custom_up_img.css">{% endblock %}{% block other %}<div class='containter'> <div class='row'> <div class='col-xs-10 col-xs-offset-1'> {% if user.is_authenticated %} <h2> {{ user.username }} </h2> <ul> {% if user.get_nickname == '' %} <li>昵稱:沒有昵稱⊙_⊙ <a id='lg_a' href='/change_nickname/?from={{ request.get_full_path }}'>創(chuàng)建昵稱</a></li> {% else %} <li> <div class="up-img-cover" id="up-img-touch" style="display: inline-block"> <span id="lg_a" onclick="" style="cursor: pointer;" data-am-popover="{content: '點擊上傳', trigger: 'hover focus'}">修改頭像</span> </div> </li> <li><a id='lg_a' href='/change_password/?from={{ request.get_full_path }}'>修改密碼</a></li> <li><a id='lg_a' href='/change_nickname/?from={{ request.get_full_path }}'>修改昵稱</a></li> <li><div>昵稱:{{ user.get_nickname }} </div></li> {% endif %} <li> 郵箱:{% if user.email %}{{ user.email }}{% else %} 未綁定 <a id='lg_a' href='/bind_email/?from={{ request.get_full_path }}'>綁定</a> {% endif %} </li> <li> 近期登錄:{{ user.last_login|date:"Y-m-d H:i:s" }} </li> <li> 最近瀏覽: <ul> {% for article in articles %} <li style="list-style-type:none; width:70%"> <span id='lg_a' class='glyphicon glyphicon-phone'></span><a href='/new_blog/content/?page={{ article.content_object.pk }}' target="_blank"> {{ article.content_object.title }}</a><span style='float: right'>{{ article.Read_time }}</span> </li> {% endfor %} </ul> </li> </ul> {% else %} <span> 未登錄,跳轉到首頁。。。 </span> <script type='text/javascript'> window.location.href = '/main'; </script> {% endif %} </div> </div></div> <div class="am-modal am-modal-no-btn up-frame-bj " tabindex="-1" id="doc-modal-1"> <div class="am-modal-dialog up-frame-parent up-frame-radius"> <div class="am-modal-hd up-frame-header"> <label>修改頭像</label> <a href="javascript: void(0)" class="am-close am-close-spin" data-am-modal-close>×</a> </div> <div class="am-modal-bd up-frame-body"> <div class="am-g am-fl"> <div class="am-form-group am-form-file"> <div class="am-fl"> <button type="button" class="am-btn am-btn-default am-btn-sm"> <i class="am-icon-cloud-upload"></i> 選擇要上傳的文件</button> </div> <input type="file" id="inputImage"> </div> </div> <div class="am-g am-fl" > <div class="up-pre-before up-frame-radius"> <img alt="" src="" id="image" > </div> <div class="up-pre-after up-frame-radius"> </div> </div> <div class="am-g am-fl"> <div class="up-control-btns"> <span class="am-icon-rotate-left" onclick="rotateimgleft()"></span> <span class="am-icon-rotate-right" onclick="rotateimgright()"></span> <span class="am-icon-check" id="up-btn-ok" url="/update_user_img/"></span> </div> </div> </div> </div></div><!--加載框--><div class="am-modal am-modal-loading am-modal-no-btn" tabindex="-1" id="my-modal-loading"> <div class="am-modal-dialog"> <div class="am-modal-hd">正在上傳...</div> <div class="am-modal-bd"> <span class="am-icon-spinner am-icon-spin"></span> </div> </div></div><!--警告框--><div class="am-modal am-modal-alert" tabindex="-1" id="my-alert"> <div class="am-modal-dialog"> <div class="am-modal-hd">信息</div> <div class="am-modal-bd" id="alert_content"> 頭像上傳成功! </div> <div class="am-modal-footer"> <span class="am-modal-btn">確定</span> </div> </div></div><script src="/static/JS/jquery-1.8.3.min.js"></script><script src="/static/JS/amazeui.min.js" charset="utf-8"></script><script src="/static/JS/cropper.min.js" charset="utf-8"></script><script src="/static/JS/custom_up_img.js" charset="utf-8"></script>{% endblock %}{% block footer %}{% endblock %}
from django.shortcuts import render, HttpResponsefrom django.http import JsonResponsefrom .models import Add_User_Infofrom django.views.decorators.csrf import csrf_exempt# 頭像上傳對應的方法@csrf_exemptdef upload_result(request): if request.method == 'POST': data = {} data['status'] = 'SUCCESS' data['message'] = '上傳成功' user = request.user if user.is_anonymous: # 未登錄,不能進行頭像的更改 data['status'] = 'ERROR' data['message'] = '未登錄' return JsonResponse(data) # 判斷對應的記錄是否存在,如果不存在則創(chuàng)建對應的記錄 if not Add_User_Info.objects.filter(user=user).exists(): rc = Add_User_Info(user=user) rc.save() update = Add_User_Info.objects.get(user=user) update.user_img_base64 = request.POST['image'] update.save() return JsonResponse(data) return HttpResponse('該請求不符合條件!')
這里使用了csrf_exempt
這個修飾器,是因為前端是通過POST請求發(fā)送的數(shù)據(jù),所以就需要用到CSRF令牌,這里為了方便就直接在該方法中使用修飾器禁用了CSRF令牌。關鍵詞:功能,頭像,用戶
微信公眾號
版權所有? 億企邦 1997-2025 保留一切法律許可權利。