Heim > Backend-Entwicklung > Python-Tutorial > Django-Projekt: Praktischer Benutzer-Avatar-Upload und Zugriff

Django-Projekt: Praktischer Benutzer-Avatar-Upload und Zugriff

不言
Freigeben: 2018-04-21 14:49:06
Original
2282 Leute haben es durchsucht

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>
Nach dem Login kopieren

urls.py

from django.conf.urls import url
from app01 import views
urlpatterns = [
  url(r&#39;^upload&#39;,views.upload)
]
Nach dem Login kopieren

views.py

from django.shortcuts import render,HttpResponse 
def upload(request):
  if request.method == &#39;POST&#39;:
    name = request.POST.get(&#39;username&#39;)
    avatar = request.FILES.get(&#39;avatar&#39;)
    with open(avatar.name,&#39;wb&#39;) as f:
      for line in avatar:
        f.write(line)
    return HttpResponse(&#39;ok&#39;)
  return render(request,&#39;upload.html&#39;)
Nach dem Login kopieren

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=&#39;avatar&#39;)
Nach dem Login kopieren

views.py

def upload(request):
  if request.method == &#39;POST&#39;:
    name = request.POST.get(&#39;username&#39;)
    avatar = request.FILES.get(&#39;avatar&#39;)
    models.User.objects.create(username=name,avatar=avatar)
    return HttpResponse(&#39;ok&#39;) 
  return render(request,&#39;upload.html&#39;)
Nach dem Login kopieren

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类似,指定用户可以通过这个路径找到文件
Nach dem Login kopieren

2. Konfigurieren Sie in urls.py

from django.views.static import serve
from upload import settings        #upload是站点名
url(r&#39;^media/(?P<path>.*)$&#39;, serve, {&#39;document_root&#39;: settings.MEDIA_ROOT}),
Nach dem Login kopieren

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>
  $(&#39;#submit-btn&#39;).on(&#39;click&#39;,function () {
    formdata = new FormData();
    formdata.append(&#39;username&#39;,$(&#39;#name-input&#39;).val());
    formdata.append("avatar",$("#avatar")[0].files[0]);
    formdata.append("csrfmiddlewaretoken",$("[name=&#39;csrfmiddlewaretoken&#39;]").val()); 
 $.ajax({
 processData:false,contentType:false,url:&#39;/upload&#39;, type:&#39;post&#39;, data:formdata,success:function (arg)
 { 
if (arg.state == 1){ alert(&#39;成功!&#39;) }
else { alert(&#39;失败!&#39;) } } }) });
 </script>
 </body> 
</html>
Nach dem Login kopieren

views.py

from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
from app01 import models
def upload(request):
  if request.method == &#39;POST&#39;:
    name = request.POST.get(&#39;username&#39;)
    avatar = request.FILES.get(&#39;avatar&#39;)
    try:
      models.User.objects.create(username=name,avatar=avatar)
      data = {&#39;state&#39;:1}
    except:
      data = {&#39;state&#39;:0}
    return JsonResponse(data)
  return render(request,&#39;upload.html&#39;)
Nach dem Login kopieren

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

  1. Objekt formdata = new FormData();

  2. Wert formdata hinzufügen ('username',$('#name-input').val());

3. Ajax muss beim Einreichen von Beiträgen eine CSRF-Überprüfung hinzufügen

  1. formdata.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val());

4 Dateien hochlädt, müssen zwei Parametereinstellungen vorhanden sein:

  1. processData:false

  2. 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里的图片)点击事件
  $(&#39;#avatar-input&#39;).on(&#39;change&#39;,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>
Nach dem Login kopieren

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

Verwandte Empfehlungen:


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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage