Django+JS 프로필 사진 을 클릭 하면 프로필 사진 을 변경 할 수 있 는 방법 예시
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 makemigrationspython 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 비밀번호:admin 12345
이후 admin 을 사용 하여 admin 배경 에 로그 인하 여 일반 사용자 두 명 을 만 들 고 각각 하나의 그림 을 프로필 로 설정 합 니 다.
일반 사용 자 를 만 든 후,그 중 하나의 test 를 사용 하여 로그 인 항목 의 첫 페이지 를 진행 합 니 다:
메모:admin 배경 에서 만 든 사용자 입 니 다.비밀 번 호 는 암호 화 되 지 않 았 기 때문에 로그 인 을 설정 하 는 데 편리 합 니 다.암호 화 된 비밀 번 호 를 검사 하 는 지,암호 화 된 비밀 번 호 를 검사 하 는 지 주의해 야 합 니 다.
여기 서 제 가 설정 한 test 와 test 1 의 비밀 번 호 는 모두 admin 의 비밀번호 와 같 습 니 다.그러면 test 에 로그 인 할 때...
admin 의 암호 화 비밀 번 호 를 test 와 test 1 의 비밀번호 에 붙 여 넣 기만 하면 됩 니 다.보존이후 test 비밀번호 admin 12345 로 로그 인
로그 인 성공 후,
수정 자료 페이지 로 이동:
프로필 사진 을 클릭 하면 새 프로필 사진 을 선택 할 수 있 습 니 다:
새 프로필 사진 선택:업로드 성공
이후 자료 페이지 를 방문 하면 새 프로필 사진 이 전시 된다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.