SORU
3 Mayıs 2011, Salı


Az Django dosyası lazım örnek upload

Django için bir acemi olarak, zorluk Django 1.3 karşıya bir uygulama yaparak geçiriyorum. Parçacıkları/güncel herhangi bir örnek bulamadım. Biri küçük, ancak tam (Model, Görünüm, Şablon) örnek bir kod bunu yayınlayabilir?

CEVAP
17 Aralık 2011, CUMARTESİ


Vay, Django belgeleri gerçekten bu konuda iyi bir örnek yok. 2 saat içinde tüm parçaları bu nasıl çalıştığını anlamak için kazmak için harcadım. Bu bilgiyle listesi dosyaları yüklemek ve göstermek için mümkün kılan bir proje hayata geçirdi. Proje için kaynak indir, https://github.com/axelpale/minimal-django-file-upload-example ziyaret veya klon için:

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

Güncelleme 2013-01-30:GitHub kaynak da 1.3 ek olarak Django 1.4 için uygulaması vardır. Birkaç değişiklik bile olsa, bir sonraki derse de 1.4 için yararlıdır.

Güncelleme 2013-05-10:GitHub at Django 1.5 uygulama. Urls.py Yeniden Yönlendirme ve url kullanımı küçük değişiklikler list.html etiketi şablonu. Çaba için hubert3 için teşekkürler.

Güncelleme 2013-12-07:Django 1.6 GitHub de destekledi. Bir ithalat myapp/urls.py değişti. Teşekkürler Arthedian gider.

Güncelleme 2015-03-17:Django 1.7 GitHub, aronysidoro sayesinde destekledi.

Güncelleme 2015-09-04:Django 1.8 GitHub, nerogit sayesinde destekledi.

Proje ağacı

Tek uygulama ve medya ile temel Django 1.3 projesi yüklemeler için dizin/.

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. Ayarlar: myproject/settings.py

Yükleme ve dosyaları hizmet etmek, Django mağazaları dosyaları nereye yüklemiş ve URL Django onları neye hizmet ettiğini belirtmek gerekir. MEDİA_ROOT ve MEDİA_URL varsayılan olarak settings.py ancak içi boş. Ayrıntılar için Django Managing Files ilk satırları bakın. Ayrıca veritabanı ayarlamak ve İNSTALLED_APPS için uygulamam eklemek unutmayın

...
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. Model: myproject/myapp/models.py

Bir sonraki FileField ile bir model gerekir. Bu özel alan mağazalarında geçerli tarih ve MEDİA_ROOT göre/2011/12/24/ medya/belgeler gibi dosyaları. FileField reference bkz.

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

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

3. Form: myproject/myapp/forms.py

Yükleme güzel işlemek için bir form gerekir. Bu form tek bir alan var ama bu kadarı yeter. Ayrıntılar için Form FileField reference bkz.

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

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

4. Görünüm: myproject/myapp/views.py

Tüm sihir burada bir görünüm. request.FILES nasıl işlendiğini dikkat edin. Benim için çok zor request.FILES['docfile'] modeller için kaydedilebilir gerçeğini fark etmek oldu.FileField böyle. Modelin() Kaydet kolları dosya sistemi otomatik olarak dosya saklamak.

# -*- 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. Proje URL: myproject/urls.py

Django varsayılan olarak MEDİA_ROOT hizmet etmez. Üretim ortamında tehlikeli olurdu. Ama geliştirme aşamasında, kısa kesebiliriz. Son satıra dikkat edin. Bu hat Django MEDİA_URL dosyaları hizmet sağlar. Bu gelişim aşamasında yalnızca çalışır.

Ayrıntılar için django.conf.urls.static.static reference bkz. Ayrıca this discussion about serving media files bkz.

# -*- 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. App URL: myproject/myapp/urls.py

Görünümü erişilebilir hale getirmek için URL belirtmeniz gerekir. Özel bir şey yok burada.

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

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

7. Şablon: myproject/myapp/templates/myapp/list.html

Son bölüm: liste şablonu ve aşağıda upload şeklinde. Şifre türü-niteliği olmalıdır şeklinde "/-veri formu" ve yöntemi"," upload yapmak mümkün. Django için sonrası parçalı set Ayrıntılar için File Uploads documentation bkz.

Bu FileField şablonları kullanılabilecek birçok özellikleri vardır. E. g. {{ document.docfile.url }} ve {{ document.docfile.adı }} şablonunu gibi. Using files in models article The File object documentation bu konuda daha bakın.

<!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. Başlatılamadı

Sadece çalıştırın syncdb ve runserver.

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

Sonuçları

Son olarak, her şey hazır. Varsayılan Django geliştirme ortamı üzerine yüklenen belgelerin listesi localhost:8000/list/ görülebilir. Bugün dosyaları 12/17/ 2011///myproject/media/belgeler için yol//yüklenir ve listeden açılabilir.

Bu cevabı birisi bana yardımcı olurduk kadar yardımcı olacağını umuyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BioHunta

    BioHunta

    28 Mayıs 2006
  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • TheRightTire

    TheRightTire

    14 EKİM 2009