2012-09-12 10 views
18

Könnte jemand ein vollständiges Beispiel zur Verwendung des tastypie Filefield, sowohl serverseitige und clientseitige bitte geben?Django-tastypie: Irgendein Beispiel zum Hochladen von Dateien im POST?

Hier ist, was ich versucht habe:

#models.py 
class Foo(models.Model): 
    img = models.ImageField(upload_to="images", null=True, blank=True) 
    body = models.CharField() 

#api.py 
class FooResource(ModelResource): 
    img = fields.FileField(attribute="image", null=True, blank=True) 
    class Meta: 
     queryset = Foo.objects.all() 

Wenn ich versuche, ein foo-Objekt mit curl zu erstellen, zB

>>> curl -F "body=test" -F "[email protected]_img.png" http://localhost:8000/api/0.1/foo/ 

Ein foo-Objekt erfolgreich erstellt wird, aber das img Feld ist null . Ich kann in Debugger sehen, dass, wenn das Bündel Objekt in der Tat hat ein img Feld Speichern, die ein InMemoryUploadedFile Objekt enthält, so dass die Anfrage ist wahrscheinlich in Ordnung. Wo mache ich mich falsch? Codefragmente sind sehr willkommen, danke!

Antwort

21

Ihre Ressourcen sollten wie folgt aussehen:

class FooResource(ModelResource): 
    img = fields.FileField(attribute="img", null=True, blank=True) 
    class Meta: 
     queryset = Foo.objects.all() 

Die attribute auf das Gebiet in dem Modell entsprechen. Wie in der Dokumentation angegeben:

ApiField.attribute

A string naming an instance attribute of the object wrapped by the Resource.

+0

Wenn ich das tue, erhalte ich die Fehlermeldung: 'Das Format angezeigt‚multipart/form-data‘hatte keine vorhanden Deserialisierung method.' ich einfach etwas fehle? –

+1

Ich fand eine Lösung für die fehlende Deserialisierung Fehler [hier] (http://stackoverflow.com/questions/12522332/how-to-access-post-data-inside-tastypie-custom-authentication), basierend auf [diese Github Beitrag] (https://github.com/toastdriven/django-tastypie/issues/42#issuecomment-5485666). –

Verwandte Themen