Javascript 如何使用ajax和django上传文件?

Javascript 如何使用ajax和django上传文件?,javascript,django,ajax,file,upload,Javascript,Django,Ajax,File,Upload,我是新来的。您能告诉我如何使用ajax向服务器发送文件吗。我可以向我的服务器提交一个字符串,但我不知道ajax如何处理文件 上传_stuff.js $(document).on('submit', '#CustomerRequest', function(e){ e.preventDefault(); $.ajax({ type:'POST', url:'/create_request', data:{ ajax_file1:$('#html_file1'

我是新来的。您能告诉我如何使用ajax向服务器发送文件吗。我可以向我的服务器提交一个字符串,但我不知道ajax如何处理文件

上传_stuff.js

$(document).on('submit', '#CustomerRequest', function(e){
e.preventDefault();
$.ajax({
    type:'POST',
    url:'/create_request',
    data:{
        ajax_file1:$('#html_file1').val(),
        ajax_file2:$('#html_file2').val(),
        ajax_file2:$('#html_file3').val(),               
                    ...
view.py

def create_request (request):
    if request.method == "POST":
            server_file1 = request.FILES('ajax_files1')
            server_file2 = request.FILES('ajax_file2')
            server_file3 = request.FILES('ajax_file3')

我的html表单上确实有csrf_标记和enctype=“multipart/form data”

我不知道这是否有用,但在JQuery中,
$('#fileinput').val()
不会返回“Ajax友好”的文件数据,请尝试使用
document.getElementById('fileinput').files[0]
使用原始javascript获取文件数据,并尝试在ajax请求中添加这些选项
contentType:false,

processData:false,

我不知道这是否有用,但在JQuery中,
$('#fileinput').val()
不会返回“Ajax友好”的文件数据,请尝试使用
document.getElementById('fileinput').files[0]
使用原始javascript获取文件数据,并尝试在ajax请求中添加这些选项
contentType:false,

processData:false,
我已经尝试过这个方法,效果很好,希望它也适用于您

首先在forms.py文件中创建一个相关表单,如下所示:

from django import forms

class FileForm(forms.Form):
   file = forms.FileField(required=True)
def saveFile(request):
    if(request.user != AnonymousUser()):
        try:
            if request.method == 'POST':
                file_form = FileForm(request.POST, request.FILES)
                sg_id = request.POST.get("sg_id")
                subgroup = SubGroup.objects.get(pk=sg_id)
                if(file_form.is_valid()):
                    file = file_form.cleaned_data["file"]
                    name = str(file)
                    f, extension = os.path.splitext(name)
                    if(extension in valid_extensions):
                        obj = Files.objects.create(
                            file = file,
                            subgroup = subgroup,
                            creator = request.user,
                            created_at = datetime.datetime.now(),
                            name = name
                        )
.......
.......
.......
在html文件中,它看起来像:

    <div>
        <form id="file_form" action="/application/new_file/" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <label class="btn btn-info btn-xs" for="subgroup_file" style="background-color: #042d63;border-color: #dddddd;border-width: 2px;color: white;padding: 5px 21px;" id="send_file" data-toggle="tooltip" data-placement="auto top" title="Choose The File">
                <input id="the_file" name="file" type="file" style="display:none;">
                <span class="glyphicon glyphicon-paperclip"></span>
            </label>
            <input type="submit" id="file_form_submit" class="my-small-btn" value="Submit" data-toggle="tooltip" data-placement="auto top" title="Submit File">
        </form>   
    </div>
在这里,我还添加了一个通知用户他/她只允许上传PDF文件。URL最终会将您从
URL.py
带到
views.py
中名为
saveFile
的函数,该函数如下所示:

from django import forms

class FileForm(forms.Form):
   file = forms.FileField(required=True)
def saveFile(request):
    if(request.user != AnonymousUser()):
        try:
            if request.method == 'POST':
                file_form = FileForm(request.POST, request.FILES)
                sg_id = request.POST.get("sg_id")
                subgroup = SubGroup.objects.get(pk=sg_id)
                if(file_form.is_valid()):
                    file = file_form.cleaned_data["file"]
                    name = str(file)
                    f, extension = os.path.splitext(name)
                    if(extension in valid_extensions):
                        obj = Files.objects.create(
                            file = file,
                            subgroup = subgroup,
                            creator = request.user,
                            created_at = datetime.datetime.now(),
                            name = name
                        )
.......
.......
.......

子组
文件
是在
models.py
中定义的对象,它们将您连接到数据库。

我已经尝试过这个方法,效果很好,希望它也适用于您

首先在forms.py文件中创建一个相关表单,如下所示:

from django import forms

class FileForm(forms.Form):
   file = forms.FileField(required=True)
def saveFile(request):
    if(request.user != AnonymousUser()):
        try:
            if request.method == 'POST':
                file_form = FileForm(request.POST, request.FILES)
                sg_id = request.POST.get("sg_id")
                subgroup = SubGroup.objects.get(pk=sg_id)
                if(file_form.is_valid()):
                    file = file_form.cleaned_data["file"]
                    name = str(file)
                    f, extension = os.path.splitext(name)
                    if(extension in valid_extensions):
                        obj = Files.objects.create(
                            file = file,
                            subgroup = subgroup,
                            creator = request.user,
                            created_at = datetime.datetime.now(),
                            name = name
                        )
.......
.......
.......
在html文件中,它看起来像:

    <div>
        <form id="file_form" action="/application/new_file/" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <label class="btn btn-info btn-xs" for="subgroup_file" style="background-color: #042d63;border-color: #dddddd;border-width: 2px;color: white;padding: 5px 21px;" id="send_file" data-toggle="tooltip" data-placement="auto top" title="Choose The File">
                <input id="the_file" name="file" type="file" style="display:none;">
                <span class="glyphicon glyphicon-paperclip"></span>
            </label>
            <input type="submit" id="file_form_submit" class="my-small-btn" value="Submit" data-toggle="tooltip" data-placement="auto top" title="Submit File">
        </form>   
    </div>
在这里,我还添加了一个通知用户他/她只允许上传PDF文件。URL最终会将您从
URL.py
带到
views.py
中名为
saveFile
的函数,该函数如下所示:

from django import forms

class FileForm(forms.Form):
   file = forms.FileField(required=True)
def saveFile(request):
    if(request.user != AnonymousUser()):
        try:
            if request.method == 'POST':
                file_form = FileForm(request.POST, request.FILES)
                sg_id = request.POST.get("sg_id")
                subgroup = SubGroup.objects.get(pk=sg_id)
                if(file_form.is_valid()):
                    file = file_form.cleaned_data["file"]
                    name = str(file)
                    f, extension = os.path.splitext(name)
                    if(extension in valid_extensions):
                        obj = Files.objects.create(
                            file = file,
                            subgroup = subgroup,
                            creator = request.user,
                            created_at = datetime.datetime.now(),
                            name = name
                        )
.......
.......
.......

子组
文件
是在
models.py
中定义的对象,它们将您连接到数据库。

是否有方法提交其他信息,而不仅仅是文件?可以是您想要的任何信息。你有什么想法?有没有一种方法可以提交其他信息,而不仅仅是文件?它可以是你想要的任何东西。你有什么想法?