python - كيف يمكنني الحصول على مسار مطلق الملفات بعد أن تم تحميلها في جانغو؟



django django-models (1)

في السابق، أقترح عليك تغيير هذا upload_to='documents/' إلى upload_to='documents/%Y/%m/%d' ، لماذا؟ هذا للتعامل مع ملفات وثيقة ضخمة داخل مسار documents/ الخاصة بك documents/ .

form.cleaned_data['document'] (أو request.FILES['document'] form.cleaned_data['document'] request.FILES['document'] ) إرجاع كائن form.cleaned_data['document'] . بطبيعة الحال form.cleaned_data['document'].name يجب أن form.cleaned_data['document'].name اسما فقط.

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()

ولكن ستحصل على اختلاف إذا كنت تستخدم 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`

أريد تحميل ملف إلى قاعدة البيانات الخاصة بي وبعد تحميله استيراده في نهاية المطاف تصدير البيانات إلى قاعدة البيانات الخاصة بي. لدي تحميل العمل على ما يرام ولكن أنا لست متأكدا من كيفية الحصول على المسار المطلق للملف بعد تحميله. أنا قادرة على طباعة اسم المستند، ولكن إذا تم تحميل نفس اسم المستند يتم إلحاقه ولكن لا يزال يظهر اسم الملف الأصلي إذا أدعو form.cleaned_data['document'].name . ماذا يمكنني أن أفعل للحصول على مسار الملف المطلق ثم استدعاء دالة لبدء معالجة هذا الملف؟

لذلك هذا هو ما أتطلع إلى القيام به:

  • يحمل المستخدم ملف كسف
  • يتم حفظ الملف في ديسيبل (مع وصف ومسار الملف.يتم الحصول على مسار الملف بشكل صحيح في ديسيبل)
  • الحصول على ملف ملف الملف الذي تم تحميله للتو
  • بدء معالجة هذا الملف لتحويل البيانات .csv وتخزينها في قاعدة البيانات

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
        })

forms.py

from django import forms
from .models import Document

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

file_upload_form.html (نموذج):

{% 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 %}




django-views