تحتاج إلى الحد الأدنى من مثال تحميل ملف Django




file upload (7)

بصفتي مبتدئًا إلى Django ، أواجه صعوبة في إنشاء تطبيق للتحميل في Django 1.3. لم أتمكن من العثور على أي مثال / قصاصات محدثة. هل يمكن لأي شخص نشر مثال على هذا النموذج على أنه مثال بسيط (كامل ، نموذج ، عرض ، قالب)؟


Phew ، وثائق دجانغو ليس لديها مثال جيد عن هذا. قضيت أكثر من ساعتين لنقوم بحفر جميع القطع لفهم كيفية عمل هذا. بهذه المعرفة قمت بتنفيذ مشروع يجعل من الممكن تحميل الملفات وعرضها كقائمة. لتنزيل مصدر للمشروع ، تفضل بزيارة https://github.com/axelpale/minimal-django-file-upload-example أو استنساخه:

> git clone https://github.com/axelpale/minimal-django-file-upload-example.git

التحديث 2013-01-30: يتضمن المصدر في GitHub أيضًا التنفيذ لـ Django 1.4 بالإضافة إلى 1.3. على الرغم من وجود بعض التغييرات ، يفيد البرنامج التعليمي التالي أيضًا في 1.4.

تحديث 2013-05-10: التنفيذ لـ Django 1.5 في GitHub. تغييرات طفيفة في إعادة التوجيه في urls.py واستخدام علامة قالب عنوان url في list.html. شكرا ل hubert3 للجهد.

تحديث 2013-12-07: دعم Django 1.6 في GitHub. تم تغيير الاستيراد واحد في myapp / urls.py. شكرا يذهب إلى Arthedian .

تحديث 2015-03-17: دعم Django 1.7 في GitHub ، بفضل aronysidoro .

تحديث 2015-09-04: دعم Django 1.8 في GitHub ، بفضل nerogit .

تحديث 2016-07-03: دعم Django 1.9 في GitHub ، وذلك بفضل daavve و nerogit

شجرة المشروع

مشروع Django 1.3 الأساسي مع تطبيق واحد ووسائط / دليل للتحميلات.

minimal-django-file-upload-example/
    src/
        myproject/
            database/
                sqlite.db
            media/
            myapp/
                templates/
                    myapp/
                        list.html
                forms.py
                models.py
                urls.py
                views.py
            __init__.py
            manage.py
            settings.py
            urls.py

1. الإعدادات: myproject / settings.py

لتحميل الملفات وعرضها ، يلزمك تحديد مكان تخزين ملفات Django وملفات URL التي يقدمها Django. يكون كل من MEDIA_ROOT و MEDIA_URL في settings.py افتراضيًا ، إلا أنهما فارغان. راجع الأسطر الأولى في Django Managing Files للحصول على التفاصيل. تذكر أيضًا تعيين قاعدة البيانات وإضافة myapp إلى INSTALLED_APPS

...
import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'database.sqlite3'),
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}
...
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
...
INSTALLED_APPS = (
    ...
    'myapp',
)

2. نموذج: myproject / myapp / models.py

بعد ذلك تحتاج إلى نموذج مع FileField. يقوم هذا الحقل بالتحديد بتخزين الملفات على سبيل المثال لوسائل الإعلام / المستندات / 2011/12/24 / بناءً على التاريخ الحالي و MEDIA_ROOT. انظر مرجع FileField .

# -*- coding: utf-8 -*-
from django.db import models

class Document(models.Model):
    docfile = models.FileField(upload_to='documents/%Y/%m/%d')

3. نموذج: myproject / myapp / forms.py

للتعامل مع التحميل بشكل جيد ، تحتاج إلى نموذج. يحتوي هذا النموذج على حقل واحد فقط ولكن هذا يكفي. راجع مرجع Form FileField للحصول على التفاصيل.

# -*- coding: utf-8 -*-
from django import forms

class DocumentForm(forms.Form):
    docfile = forms.FileField(
        label='Select a file',
        help_text='max. 42 megabytes'
    )

4. عرض: myproject / myapp / views.py

وجهة نظر حيث يحدث كل السحر. انتبه كيف يتم التعامل مع الملفات. بالنسبة لي ، كان من الصعب حقاً تحديد حقيقة أن request.FILES['docfile'] يمكن حفظ [ملفات docfile] في models.FileField تماماً مثل هذا. يقوم () الحفظ الخاص بالنموذج بمعالجة تخزين الملف إلى نظام الملفات تلقائيًا.

# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

from myproject.myapp.models import Document
from myproject.myapp.forms import DocumentForm

def list(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('myapp.views.list'))
    else:
        form = DocumentForm() # A empty, unbound form

    # Load documents for the list page
    documents = Document.objects.all()

    # Render list page with the documents and the form
    return render_to_response(
        'myapp/list.html',
        {'documents': documents, 'form': form},
        context_instance=RequestContext(request)
    )

5. عناوين URL للمشروعات: myproject / urls.py

لا يقدم Django خدمة MEDIA_ROOT بشكل افتراضي. من شأنه أن يكون خطيرا في بيئة الإنتاج. لكن في مرحلة التطوير ، كان بوسعنا أن نختصر. انتبه إلى السطر الأخير. يتيح هذا الخط لـ Django خدمة الملفات من MEDIA_URL. هذا يعمل فقط في مرحلة التطوير.

راجع المرجع django.conf.urls.static.static للحصول على التفاصيل. راجع أيضًا هذه المناقشة حول عرض ملفات الوسائط .

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    (r'^', include('myapp.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

6. عناوين URL للتطبيقات: myproject / myapp / urls.py

لإتاحة الوصول للعرض ، يجب عليك تحديد عناوين url له. لا شيء خاص هنا.

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url

urlpatterns = patterns('myapp.views',
    url(r'^list/$', 'list', name='list'),
)

7. القالب: myproject / myapp / templates / myapp / list.html

الجزء الأخير: نموذج للقائمة ونموذج التحميل أدناه. يجب أن يشتمل النموذج على سمة enctype-set على "multipart / form-data" وأن يتم تعيين الطريقة على "post" لجعل التحميل إلى Django ممكنًا. راجع وثائق File Uploads للحصول على التفاصيل.

يحتوي FileField على العديد من السمات التي يمكن استخدامها في القوالب. مثال {{document.docfile.url}} و {{document.docfile.name}} كما في القالب. انظر المزيد عن ذلك في استخدام الملفات في نماذج الموديلات ووثائق كائن الملف .

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Minimal Django File Upload Example</title>   
    </head>
    <body>
    <!-- List of uploaded documents -->
    {% if documents %}
        <ul>
        {% for document in documents %}
            <li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}</a></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No documents.</p>
    {% endif %}

        <!-- Upload form. Note enctype attribute! -->
        <form action="{% url 'list' %}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <p>{{ form.non_field_errors }}</p>
            <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p>
            <p>
                {{ form.docfile.errors }}
                {{ form.docfile }}
            </p>
            <p><input type="submit" value="Upload" /></p>
        </form>
    </body>
</html> 

8. تهيئة

فقط قم بتشغيل syncdb ويفرفر.

> cd myproject
> python manage.py syncdb
> python manage.py runserver

النتائج

أخيراً ، كل شيء جاهز. في بيئة تطوير Django الافتراضية ، يمكن رؤية قائمة الوثائق التي تم تحميلها على localhost:8000/list/ . اليوم يتم تحميل الملفات إلى / المسار / إلى / myproject / media / documents / 2011/12/17 / ويمكن فتحها من القائمة.

آمل أن تساعد هذه الإجابة شخص ما بقدر ما ساعدني.


بشكل عام عندما تحاول "مجرد الحصول على مثال عملي" فمن الأفضل "مجرد البدء في كتابة التعليمات البرمجية". لا يوجد رمز هنا لمساعدتك ، لذلك يجعل الإجابة على السؤال الكثير من العمل بالنسبة لنا.

إذا كنت تريد الحصول على ملف ، فأنت بحاجة إلى شيء من هذا القبيل في ملف html في مكان ما:

<form method="post" enctype="multipart/form-data">
    <input type="file" name="myfile" />
    <input type="submit" name="submit" value="Upload" />
</form>

سيعطيك ذلك زر التصفح ، زر التحميل لبدء الإجراء (إرسال النموذج) ولاحظ ذلك المدخل الذي يعرفه جانغو ليعطيك طلبًا. FILES

في مكان ما في مكان ما يمكنك الوصول إلى الملف مع

def myview(request):
    request.FILES['myfile'] # this is my file

هناك كمية هائلة من المعلومات في مستندات تحميل الملفات

أنصحك بقراءة الصفحة تمامًا والبدء في كتابة التعليمات البرمجية فقط - ثم الرجوع إلى الأمثلة وتتبعات المكدس عند عدم نجاحها.


توسيع على سبيل المثال هنري :

import tempfile
import shutil

FILE_UPLOAD_DIR = '/home/imran/uploads'

def handle_uploaded_file(source):
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=FILE_UPLOAD_DIR)
    with open(filepath, 'wb') as dest:
        shutil.copyfileobj(source, dest)
    return filepath

يمكنك استدعاء هذه الوظيفة handle_uploaded_file من العرض الخاص بك مع كائن الملف الذي تم تحميله. سيؤدي هذا إلى حفظ الملف باسم فريد (مسبوقًا باسم الملف للملف الأصلي الذي تم تحميله) في نظام الملفات وإرجاع المسار الكامل للملف المحفوظ. يمكنك حفظ المسار في قاعدة البيانات ، والقيام بشيء ما مع الملف لاحقًا.


كان لدي أيضا شرط مماثل. معظم الأمثلة على شبكة الإنترنت تطلب إنشاء نماذج وإنشاء نماذج لم أكن أريد استخدامها. هنا هو رمزي النهائي.

if request.method == 'POST':
    file1 = request.FILES['file']
    contentOfFile = file1.read()
    if file1:
        return render(request, 'blogapp/Statistics.html', {'file': file1, 'contentOfFile': contentOfFile})

وفي HTML لتحميل كتبت:

{% block content %}
    <h1>File content</h1>
    <form action="{% url 'blogapp:uploadComplete'%}" method="post" enctype="multipart/form-data">
         {% csrf_token %}
        <input id="uploadbutton" type="file" value="Browse" name="file" accept="text/csv" />
        <input type="submit" value="Upload" />
    </form>
    {% endblock %}

التالي هو HTML الذي يعرض محتوى الملف:

{% block content %}
    <h3>File uploaded successfully</h3>
    {{file.name}}
    </br>content = {{contentOfFile}}
{% endblock %}

من الممكن أن يساعدك هذا: إنشاء حقل ملف في models.py الخاص بك

لتحميل الملف (في admin.py):

def save_model(self, request, obj, form, change):
    url = "http://img.youtube.com/vi/%s/hqdefault.jpg" %(obj.video)
    url = str(url)

    if url:
        temp_img = NamedTemporaryFile(delete=True)
        temp_img.write(urllib2.urlopen(url).read())
        temp_img.flush()
        filename_img = urlparse(url).path.split('/')[-1]
        obj.image.save(filename_img,File(temp_img)

واستخدم هذا الحقل في القالب الخاص بك أيضًا.


واجهت مشكلة مماثلة ، وحلها موقع admin django.

# models
class Document(models.Model):
    docfile = models.FileField(upload_to='documents/Temp/%Y/%m/%d')

    def doc_name(self):
        return self.docfile.name.split('/')[-1] # only the name, not full path

# admin
from myapp.models import Document
class DocumentAdmin(admin.ModelAdmin):
    list_display = ('doc_name',)
admin.site.register(Document, DocumentAdmin)

يمكنك الرجوع إلى أمثلة الخادم في Fine Uploader ، الذي يحتوي على إصدار django. https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader

انها أنيقة جدا والأهم من ذلك كله ، فإنه يوفر js lib مميزة. لا يتم تضمين القالب في أمثلة الخادم ، ولكن يمكنك العثور على العرض التوضيحي على موقع الويب الخاص به. برنامج Uploader الرائع: http://fineuploader.com/demos.html

جانغو غرامة-رافع

views.py

UploadView dispatches نشر وحذف الطلب إلى معالجات منها.

class UploadView(View):

    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(UploadView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        """A POST request. Validate the form and then handle the upload
        based ont the POSTed data. Does not handle extra parameters yet.
        """
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_upload(request.FILES['qqfile'], form.cleaned_data)
            return make_response(content=json.dumps({ 'success': True }))
        else:
            return make_response(status=400,
                content=json.dumps({
                    'success': False,
                    'error': '%s' % repr(form.errors)
                }))

    def delete(self, request, *args, **kwargs):
        """A DELETE request. If found, deletes a file with the corresponding
        UUID from the server's filesystem.
        """
        qquuid = kwargs.get('qquuid', '')
        if qquuid:
            try:
                handle_deleted_file(qquuid)
                return make_response(content=json.dumps({ 'success': True }))
            except Exception, e:
                return make_response(status=400,
                    content=json.dumps({
                        'success': False,
                        'error': '%s' % repr(e)
                    }))
        return make_response(status=404,
            content=json.dumps({
                'success': False,
                'error': 'File not present'
            }))

forms.py

class UploadFileForm(forms.Form):

    """ This form represents a basic request from Fine Uploader.
    The required fields will **always** be sent, the other fields are optional
    based on your setup.
    Edit this if you want to add custom parameters in the body of the POST
    request.
    """
    qqfile = forms.FileField()
    qquuid = forms.CharField()
    qqfilename = forms.CharField()
    qqpartindex = forms.IntegerField(required=False)
    qqchunksize = forms.IntegerField(required=False)
    qqpartbyteoffset = forms.IntegerField(required=False)
    qqtotalfilesize = forms.IntegerField(required=False)
    qqtotalparts = forms.IntegerField(required=False)






upload