【问题标题】:Django - Ajax - Uploader Model: Save fileDjango - Ajax - 上传器模型:保存文件
【发布时间】:2015-03-21 17:09:27
【问题描述】:

我正在尝试制作 django-ajax-uploader 来创建模型。我已经创建了一个示例,但我不明白是否需要使用 import_uploader 或创建一个简单的类来保存模型和文件。我不知道如果我这样做是否会禁用 AJAX 操作。

urls.py

from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'bft.views.home', name='home'),
    # url(r'^bft/', include('bft.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
    url(r'start$', 'bbb.views.start', name="start"),
    url(r'ajax-upload$', 'bbb.views.import_uploader', name="my_ajax_upload"),
)

views.py

from django.middleware.csrf import get_token
from django.shortcuts import render_to_response
from django.template import RequestContext
from ajaxuploader.views import AjaxFileUploader

def start(request):
    csrf_token = get_token(request)
    return render_to_response('import.html',
        {'csrf_token': csrf_token}, context_instance = RequestContext(request))

import_uploader = AjaxFileUploader()
# Create your views here.

import.html

 <!doctype html>
        <head>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" ></script>
            <script src="{{ STATIC_URL }}ajaxuploader/js/fileuploader.js" ></script>
            <link href="{{ STATIC_URL }}ajaxuploader/css/fileuploader.css" media="screen" rel="stylesheet" type="text/c$
            <script>
                $(function(){
                var uploader = new qq.FileUploader({
                    action: "/ajax-upload",
                    element: $('#file-uploader')[0],
                    multiple: true,
                    onComplete: function(id, fileName, responseJSON) {
                        if(responseJSON.success) {
                            alert("success!");
                        } else {
                            alert("upload failed!");
                        }
                    },
                    onAllComplete: function(uploads) {
                        // uploads is an array of maps
                        // the maps look like this: {file: FileObject, response: JSONServerResponse}
                        alert("All complete!");
                    },
                    params: {
                        'csrf_token': '{{ csrf_token }}',
                        'csrf_name': 'csrfmiddlewaretoken',
                        'csrf_xname': 'X-CSRFToken',
                    },
                });
                });
            </script>
        </head>
    <body>
        <div id="file-uploader">
            <noscript>
                <p>Please enable JavaScript to use file uploader.</p>
            </noscript>
        </div>
    </body>
    </html>

【问题讨论】:

    标签: jquery python ajax django file-upload


    【解决方案1】:

    首先我建议您使用模型 FILEFIELD 创建一个模型来存储文件的信息和 url:

    设置您的媒体文件,文件的存储位置 设置.py

    MEDIA_ROOT = os.path.join(BASE_DIR,'media')
    MEDIA_URL = '/media/'
    

    models.py

    from django.core.files.storage import default_storage
    ...
    
    class UploadFile(models.Model):
          file = models.FileField(upload_to='docs/')
    

    Forms.py:

    class UploadForm(forms.ModelForm):
        documento = forms.FileField(label='Seleccione un archivo',
                                    help_text='Max Size 2mb'
                                   )
        class Meta:
           model = UploadFile
    

    views.py:

    def UploadView(request):
        if request.method == 'POST':
           form = UploadForm(request.POST,request.FILES)
           if form.is_valid():
              form.save()
              return HttpResponseRedirect('/index/')
        else:
           form = DocuForm()
        return render_to_response("yourtemplate.html",
                                  {'form':form},
                                  context_instance=RequestContext(request))
    

    在可以点击文件名的表格中显示文件一览,下载。 如果要启用文件的下载,请以这种方式更改 urls.py:

    urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'kp.views.home', name='home'),
        # url(r'^blog/', include('blog.urls')),
        url(r'^upload/$', 'kms.views.UploadView', name='upload'),
    )+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    【讨论】:

    • 我怎样才能用文件发送其他参数,如果我把其他文件放在表单上,​​我可以用这个插件 ajax 接收这个吗?
    • 这个方法不需要ajax插件,所有的工作都是在视图的http请求中完成的。在这行代码“form = UploadForm(request.POST,request.FILES)”的视图中,您无需使用 ajax 插件即可从 html 表单接收字段和文件
    • 但这个想法是作为 ajax 上传,不会刷新页面。
    • 在您的 AJAX POST 请求中,您需要发送文件并更改 [url in django] (docs.djangoproject.com/en/1.7/topics/http/urls) 以接受参数。 POST 必须为您发送 ajax 函数,而不是 django 表单
    【解决方案2】:

    包中提供的信号功能就是答案,谢谢!

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2021-03-14
      • 2012-06-24
      • 2011-12-12
      • 1970-01-01
      • 2021-11-04
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多