In diesem Artikel werden hauptsächlich praktische Beispiele für das Hochladen und Zugreifen auf Benutzeravatare in Django-Projekten vorgestellt. Jetzt teile ich sie mit Ihnen und gebe ihnen eine Referenz. Werfen wir gemeinsam einen Blick darauf
1 Speichern Sie die Datei lokal auf dem Server
upload.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} <p>用户名:<input type="text" name="username"></p> <p>头像<input type="file" name="avatar"></p> <input type="submit" value="提交"> </form> </body> </html>
urls.py
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^upload',views.upload) ]
views.py
from django.shortcuts import render,HttpResponse def upload(request): if request.method == 'POST': name = request.POST.get('username') avatar = request.FILES.get('avatar') with open(avatar.name,'wb') as f: for line in avatar: f.write(line) return HttpResponse('ok') return render(request,'upload.html')
Zusammenfassung
Auf diese Weise haben wir ein einfaches kleines Beispiel für das Hochladen von Dateien erstellt. Hier sind einige Punkte zu beachten:
1. Die csrf_token-Überprüfung muss dem Formular hinzugefügt werden
2. Der Typwert des Eingabefelds der Datei ist Datei
3. Um die Datei in der Ansichtsfunktion abzurufen, verwenden Sie request.FILES .get()-Methode
4 . Der Name der Datei kann über obj.name abgerufen werden
2 Laden Sie die Datei in die Datenbank hoch
models.py
from django.db import models class User(models.Model): username = models.CharField(max_length=16) avatar = models.FileField(upload_to='avatar')
views.py
def upload(request): if request.method == 'POST': name = request.POST.get('username') avatar = request.FILES.get('avatar') models.User.objects.create(username=name,avatar=avatar) return HttpResponse('ok') return render(request,'upload.html')
Zusammenfassung
Die Funktion zum Hochladen von Dateien in die Datenbank wurde oben implementiert. Es sind einige Punkte zu beachten:
1. Die Das sogenannte Hochladen in die Datenbank bedeutet nicht, das Bild selbst oder den Binärcode in der Datenbank abzulegen. Tatsächlich wird die Datei lokal auf den Server hochgeladen, sodass der Benutzer dies nur wünscht Um die Datei aufzurufen, kann er über den Pfad
2 zum vom Server angegebenen Speicherort gehen. Beim Erstellen eines ORM muss das Avatar-Feld vorhanden sein. Es gibt ein Attribut upload_to='', das angibt, wo die hochgeladenen Dateien abgelegt werden sollen Datei
3. Beim Hinzufügen zur Datenbank entspricht die Zuweisung des Dateifeldattributs der Form des normalen Felds, z. B. models.User.objects create(username=name,avatar=avatar)
4 . Wenn die von zwei Benutzern hochgeladenen Dateinamen identisch sind, benennt das System die Datei automatisch um:
Zusätzlich
Funktion wurde implementiert. Wenn wir die Datei aufrufen, müssen wir anscheinend nur über die Datei selbst auf das Bild zugreifen, das im Datenbankdateipfad gespeichert wurde auf der Webseite angezeigt wird, ist dies nicht der Fall.
Wir müssen einige Dinge konfigurieren, damit Django es finden kann, andernfalls besteht es die URL-Überprüfung nicht, und der Grund, warum wir es finden können Der direkte Zugriff auf statische Dateien in static liegt daran, dass Django bereits für uns konfiguriert wurde.
Die Konfigurationsschritte sind wie folgt:
1. Konfigurieren Sie
in den Einstellungen der Site .py
MEDIA_ROOT=os.path.join(BASE_DIR,"blog","media") #blog是项目名,media是约定成俗的文件夹名 MEDIA_URL="/media/" # 跟STATIC_URL类似,指定用户可以通过这个路径找到文件
2. Konfigurieren Sie in urls.py
from django.views.static import serve from upload import settings #upload是站点名 url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
Nach der Konfiguration , Sie können über http://127.0.0.1:8001/media/milk.png auf das Bild zugreifen
3 Verwenden Sie AJAX, um Dateien einzureichen
upload.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <form> {% csrf_token %} <p>用户名:<input id="name-input" type="text"></p> <p>头像<input id="avatar-input" type="file"></p> <input id="submit-btn" type="button" value="提交"> </form> <script src="/static/js/jquery-3.2.1.min.js"></script> <script> $('#submit-btn').on('click',function () { formdata = new FormData(); formdata.append('username',$('#name-input').val()); formdata.append("avatar",$("#avatar")[0].files[0]); formdata.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val()); $.ajax({ processData:false,contentType:false,url:'/upload', type:'post', data:formdata,success:function (arg) { if (arg.state == 1){ alert('成功!') } else { alert('失败!') } } }) }); </script> </body> </html>
views.py
from django.shortcuts import render,HttpResponse from django.http import JsonResponse from app01 import models def upload(request): if request.method == 'POST': name = request.POST.get('username') avatar = request.FILES.get('avatar') try: models.User.objects.create(username=name,avatar=avatar) data = {'state':1} except: data = {'state':0} return JsonResponse(data) return render(request,'upload.html')
Zusammenfassung
1. Beim Hochladen mit Ajax darf die Eingabeschaltfläche nicht „Senden“ verwenden.
2 Beim Hochladen mit Ajax ist der Wert des Datenparameters kein Wert mehr gewöhnlicher Wörterbuchtypwert, aber ein FormData-Objekt
Objekt formdata = new FormData();
Wert formdata hinzufügen ('username',$('#name-input').val());
3. Ajax muss beim Einreichen von Beiträgen eine CSRF-Überprüfung hinzufügen
formdata.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val());
4 Dateien hochlädt, müssen zwei Parametereinstellungen vorhanden sein:
processData:false
contentType:false
4 Beim Hochladen von Bilddateien gibt es eine Vorschaufunktion
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <form> <!----用一个label标签将上传文件输入框跟图片绑定一起, 点击图片的时候就相当于点击了上传文件的按钮----> <label><img id="avatar-img" src="/static/img/default.png" width="80px" height="80px"> <p>头像<input id="avatar-input" hidden type="file"></p> </label> <input id="submit-btn" type="button" value="提交"> </form> <script src="/static/js/jquery-3.2.1.min.js"></script> <script> // 上传文件按钮(label里的图片)点击事件 $('#avatar-input').on('change',function () { // 获取用户最后一次选择的图片 var choose_file=$(this)[0].files[0]; // 创建一个新的FileReader对象,用来读取文件信息 var reader=new FileReader(); // 读取用户上传的图片的路径 reader.readAsDataURL(choose_file); // 读取完毕之后,将图片的src属性修改成用户上传的图片的本地路径 reader.onload=function () { $("#avatar-img").attr("src",reader.result) } }); </script>
5 Zusammenfassung
Beim Datei-Upload, egal ob es sich um eine direkte Formularübermittlung oder eine Ajax-Übermittlung handelt, besteht das grundlegende Problem darin, dem Browser mitzuteilen, dass es sich bei dem, was Sie hochladen möchten, um eine Datei und nicht um eine gewöhnliche Zeichenfolge handelt
Dies können Sie dem Browser mitteilen, indem Sie den ContentType-Parameter des Gewichts anfordern. Wir müssen ihn beim Hochladen einer normalen Zeichenfolge nicht angeben, da er einen Standardwert hat.
Wenn Sie Wenn Sie Dateien übertragen möchten, müssen Sie dies separat angeben. Um die folgenden Punkte zusammenzufassen
1. Für den Formular-Upload wird ContentType durch enctype="multipart/form-data" angegeben
2. Für den Ajax-Upload wird ContentType durch processData:false und contentType:false
angegeben 3. Beim Hochladen des Formulars werden die Dateidaten durch das Tag umschlossen. 4. Beim Hochladen des Ajax werden die Daten durch eine FormData-Instanz hinzugefügt Objekt. Übergeben Sie einfach dieses Objekt, wenn Sie es übergeben
5. Nachdem die Daten übergeben wurden, werden sie in request.FILES statt in request.POST gekapselt
Wie Django CSS- und JS-Dateien und statische Bilder lädt
Detaillierte Erläuterung der Verwendung von Django-Steuerelementen und der Übergabe von Parametern
Das obige ist der detaillierte Inhalt vonDjango-Projekt: Praktischer Benutzer-Avatar-Upload und Zugriff. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!