2016-08-01 60 views
5

Oluşturulan dosya indirme işleminin bir Django REST Framework yanıtı olarak geri dönmesi gerekiyor.Django REST Framework ile oluşturulan dosya indirme nasıl geri alınır?

def retrieve(self, request, *args, **kwargs): 
    template = webodt.ODFTemplate('test.odt') 
    queryset = Pupils.objects.get(id=kwargs['pk']) 
    serializer = StudentSerializer(queryset) 
    context = dict(serializer.data) 
    document = template.render(Context(context)) 
    doc = converter().convert(document, format='doc') 
    res = HttpResponse(
     FileWrapper(doc), 
     content_type='application/msword' 
    ) 
    res['Content-Disposition'] = u'attachment; filename="%s_%s.zip"' % (context[u'surname'], context[u'name']) 
    return res 

Ama json gibi bir Msword belgesi döndürür: Aşağıdaki çalıştı.

Dosya yerine indirmeye nasıl başlayabilirim?

+0

indirebilmeli mi? –

+0

@ PiyushS.Wanare tam olarak – Viktor

+0

Dosya oluşturulduktan sonra, eğer web sunucunuzdan (Django kodu, yetkilendirme, vb.) Herkes tarafından erişilebiliyorsa, 302 Yönlendirme yanıtı gönderebilirsiniz. – Owen

cevap

1

bakın.

@permission_classes((permissions.IsAdminUser,)) 
class StudentDocxViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): 
    def retrieve(self, request, *args, **kwargs): 
     template = webodt.ODFTemplate('test.odt') 
     queryset = Pupils.objects.get(id=kwargs['pk']) 
     serializer = StudentSerializer(queryset) 
     context = dict(serializer.data) 
     document = template.render(Context(context)) 
     doc = converter().convert(document, format='doc') 
     p = u'docs/cards/%s/%s_%s.doc' % (datetime.now().date(), context[u'surname'], context[u'name']) 
     path = default_storage.save(p, doc) 
     return response.Response(u'/media/' + path) 

Ve ön uç böyle ele (angularjs SPA)

Sen o Ön uç kullanıcı yüzden Arabirimi'ne geçmesi gereken bir kelime dosyası oluşturduktan söylemek demek
$http(req).success(function (url) { 
    console.log(url); 
    window.location = url; 
}) 
2

Bu sizin için işe yarayabilir: FrontEnd kodu için

file_path = file_url 
FilePointer = open(file_path,"r") 
response = HttpResponse(FilePointer,content_type='application/msword') 
response['Content-Disposition'] = 'attachment; filename=NameOfFile' 

return response. 

medyanın klasöre kaydetme ve ön ucuna bunun bağlantı göndererek sorunu da hallettim this

+0

Bu satırı 'FilePointer.write (yanıt, metin) 'yapamıyorum. Dosyam zaten oluşturuldu ve sunucuya kaydedildi. Orada ne yazmalıyım? – Viktor

+0

Metin, kelime dosya metniniz olacak. –

+0

gibi metin dosyası yazdıkça 'f = open ('c: \ file.doc'," w ") f.write (metin)' –