اذهب إلى المحتوى

السؤال

نشر

أواجه صعوبة في إنشاء تطبيق لرفع الملفات في جانغو Django. لم أتمكن من العثور على أي أمثلة حديثة لكيفية عمل نظام MVT لرفع الملفات إلى الخادم بأي طريقة.

كيف يمكن رفع الملفات بطريقة صحيحة ، هل يمكن لأي أحد شرح مثال بسيط للقيام بهذا الأمر؟

أستخدم الإصدار 3.0 من جانغو Django مع بايثون 3.7

Recommended Posts

  • 1
نشر

يمكنك القيام بهذه الخطوات لرفع الملف الى السيرفر بإستخدام Django

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. يخزن هذا الحقل المحدد الملفات على سبيل المثال إلى media / documents / 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. هذا النموذج يحتوي على حقل واحد فقط ولكن هذا يكفي. راجع مرجع 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

عرض View حيث يحدث المهم. انتبه كيف request.FILES يتم التعامل معها.

حيث كان من الصعب حقًا تحديد حقيقة أنه request.FILES['docfile'] يمكن حفظها في models.FileField.

حيث يتعامل دالة save() مع تخزين الملف في نظام الملفات تلقائيًا.

# -*- 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):
    # التعامل مع رفع الملف
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()

            # التحويل الى قائمة المستندات بعد POST
            return HttpResponseRedirect(reverse('myapp.views.list'))
    else:
        form = DocumentForm() # نموذج فارغ غير محدد

    # تحميل المستندات من أجل صفحة القائمة
    documents = Document.objects.all()

    # تصيير صفحة القائمة مع المستندات والنموذج
    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

لتسهيل الوصول إلى العرض View ، يجب عليك تحديد عناوين url الخاصة به. لا يوجد الكثير هنا.

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

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

7. النموذج أو Template القالب : myproject / myapp / Templates / myapp / list.html

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

يحتوي FileField على العديد من السمات التي يمكن استخدامها في القوالب. على سبيل المثال ، {{document.docfile.url}} و {{document.docfile.name}} كما في القالب. 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Minimal Django File Upload Example</title>   
    </head>
    <body>
    <!-- قائمة المستندات المرفوعة -->
    {% 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 %}

        <!-- نموذج الرفع وايضاً لاحظ خاصية enctype -->
        <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 و runserver.

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

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

  • 0
نشر

تحميل الملف إلى الخادم باستخدام Django هو مهمة سهلة للغاية. يوفر Django طرق مضمنة تساعد في تحميل ملف على الخادم.

يتم استخدام طريقة Forms.FileField () لإنشاء إدخال ملف وإرسال الملف إلى الخادم. أثناء العمل مع الملفات ، تأكد من أن علامة نموذج HTML تحتوي على خاصية enctype = "multipart / form-data".

 لنرى مثالاً 

index.html

إنشاء نموذج HTML يحتوي على مكون إدخال ملف.

<body>  
<form method="POST" class="post-form" enctype="multipart/form-data">  
        {% csrf_token %}  
        {{ form.as_p }}  
        <button type="submit" class="save btn btn-default">Save</button>  
</form>  
</body>  

forms.py

from django import forms  
class StudentForm(forms.Form):  
    firstname = forms.CharField(label="Enter first name",max_length=50)  
    lastname  = forms.CharField(label="Enter last name", max_length = 10)  
    email     = forms.EmailField(label="Enter Email")  
    file      = forms.FileField() # for creating file input  

views.py

هنا ، طلب param إضافي واحد. الملفات مطلوبة في المنشئ. تحتوي هذه الوسيطة على نسخة الملف الذي تم تحميله.

from django.shortcuts import render  
from django.http import HttpResponse  
from myapp.functions.functions import handle_uploaded_file  
from myapp.form import StudentForm  
def index(request):  
    if request.method == 'POST':  
        student = StudentForm(request.POST, request.FILES)  
        if student.is_valid():  
            handle_uploaded_file(request.FILES['file'])  
            return HttpResponse("File uploaded successfuly")  
    else:  
        student = StudentForm()  
        return render(request,"index.html",{'form':student})  

urls.py

from django.contrib import admin  
from django.urls import path  
from myapp import views  
urlpatterns = [  
    path('admin/', admin.site.urls),  
    path('index/', views.index),  
]  

Upload Script

تُستخدم هذه الوظيفة لقراءة الملف الذي تم تحميله وتخزينه في الموقع المتوفر. ضع هذا الرمز في ملف functions.py. لكن قم أولاً بإنشاء هذا الملف في المشروع.

def handle_uploaded_file(f):  
    with open('myapp/static/upload/'+f.name, 'wb+') as destination:  
        for chunk in f.chunks():  
            destination.write(chunk)  

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...