Wie bekomme ich einen absoluten Pfad, nachdem ich in Django hochgeladen wurde?

Ich möchte eine Datei in meine Datenbank hochladen und nach dem Hochladen importieren und schließlich die Daten in meine Datenbank exportieren. Ich habe das Hochladen funktioniert ganz gut, aber ich bin mir nicht sicher, wie man den absoluten Pfad der Datei bekommen kann, nachdem er hochgeladen wurde. Ich kann den Namen des Dokuments ausdrucken, aber wenn derselbe Dokumentname hochgeladen wird, wird er angehängt, aber zeigt den ursprünglichen Dateinamen an, wenn ich form.cleaned_data['document'].name nenne. Was kann ich tun, um den absoluten Dateipfad zu bekommen und dann eine Funktion aufzurufen, um die Verarbeitung dieser Datei zu starten?

Also das ist, was ich schaue zu tun:

  • Der Benutzer lädt eine .csv-Datei hoch
  • Datei wird in db gespeichert (mit einer Beschreibung und einem Dateipfad. Dateipfad wird ordnungsgemäß in db gespeichert)
  • Holen Sie sich die Datei der Datei, die gerade hochgeladen wurde
  • Starten Sie diese Datei, um die .csv-Daten zu konvertieren und in der Datenbank zu speichern

Models.py

 from django.db import models # Create your models here. class Document(models.Model): description = models.CharField(max_length=255, blank=True) document = models.FileField(upload_to='documents/') uploaded_at = models.DateTimeField(auto_now_add=True) 

Views.py

 from django.shortcuts import render, redirect from django.views import View # Create your views here. from .forms import DocumentForm from .models import Document class FileUpload(View): def post(self, request): form = DocumentForm(request.POST, request.FILES) if form.is_valid(): print() print(form.cleaned_data['document'].name) form.save() return redirect('main_db_model:home') else: return render(request, 'file_upload_form.html', { 'form': form }) def get(self, request): form = DocumentForm() return render(request, 'file_upload_form.html', { 'form': form }) 

Form.py

 from django import forms from .models import Document class DocumentForm(forms.ModelForm): class Meta: model = Document fields = ('description', 'document', ) 

File_upload_form.html (Vorlage):

 {% extends "base.html" %} {% block content %} <form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">Upload</button> </form> {% if saved %} <strong>Your profile was saved.</strong> {% endif %} This is the form page <p><a href="{% url 'main_db_model:home' %}">Return to home</a></p> <p>Uploaded files:</p> <ul> {% for obj in documents %} <li> <a href="{{ obj.document.url }}">{{ obj.document.name }}</a> <small>(Uploaded at: {{ obj.uploaded_at }})</small> {{ obj.document.url }} </li> {% endfor %} </ul> {% endblock %} 

One Solution collect form web for “Wie bekomme ich einen absoluten Pfad, nachdem ich in Django hochgeladen wurde?”

Bisher schlage ich vor, dass Sie diese upload_to='documents/' auf upload_to='documents/%Y/%m/%d' ändern, warum? Dies, um riesige Dokumentdateien in Ihrem Pfad von documents/ .


form.cleaned_data['document'] (oder request.FILES['document'] ) gibt ein UploadedFile Objekt zurück. Natürlich form.cleaned_data['document'].name sollte nur einen Namen zurückgeben.

 class FileUpload(View): def post(self, request): form = DocumentForm(request.POST, request.FILES) if form.is_valid(): # this `initial_obj` if you need to update before it uploaded. # such as `initial_obj.user = request.user` if you has fk to `User`, # if not you can only using `obj = form.save()` initial_obj = form.save(commit=False) initial_obj.save() # return path name from `upload_to='documents/'` in your `models.py` + absolute path of file. # eg; `documents/filename.csv` print(initial_obj.document) # return `MEDIA_URL` + `upload_to` + absolute path of file. # eg; `/media/documents/filename.csv` print(initial_obj.document.url) form.save() 

Aber du wirst ein anderes bekommen, wenn du upload_to='documents/%Y/%m/%d' ,

 print(initial_obj.document) # `documents/2017/02/29/filename.csv` print(initial_obj.document.url) # `/media/documents/2017/02/29/filename.csv` 
  • Erstellen Sie eine Zeile des Datums beim Erstellen von Superuser
  • Kann ich ein Django-Formular ohne Modell haben
  • Django: Wie kann man Modelle aus der Datenbank aktualisieren oder neu laden
  • Ändern Sie das klickbare Feld in Django admin list_display
  • Wie kann man Ergebnisdatei mit Django bedienen?
  • So erstellen Sie Password Field im Modell django
  • Python ist die beste Programmiersprache der Welt.