2017-03-25 5 views
0

Es tut mir leid, aber ich bin wirklich neu in Django und ich habe bereits die Schritte in der Dokumentation ausprobiert. Leider funktioniert es nicht so, wie ich es erwarten würde. Ich hatte gehofft, dass nach dem Ausführen der Schritte es die Datei in meinem Medienordner speichern würde. Wenn möglich, möchte ich auch AJAX verwenden, aber ich kann den Fluss nicht verstehen.Wie lade ich Dateien in Django hoch?

HTML

<form method="post" enctype="multipart/form-data"> 
      {% csrf_token %} 
      <input type="file" name="myfile"> 
      <button type="submit">Upload</button> 
</form> 

models.py

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    email = models.TextField(max_length=500, blank=True) 
    contact_number = models.CharField(max_length=30, blank=True) 
    profile_picture = models.FileField(null=True,blank=True) 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

forms.py

class UploadForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('profile_picture',) 

views.py

def model_form_upload(request): 
    if request.method == 'POST': 
     form = UploadForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return redirect('/home/') 

Ich versuche, ein Foto für das Profil eines Benutzers zu speichern. Bitte hilf mir. Wenn es eine Möglichkeit gibt, dies mit AJAX zu tun, wäre das auch hilfreich.

+0

Wie debuggen Sie es? Machen Sie eine else (für 'form.is_valid()'), mit 'print (form.errors)', um zu überprüfen, was passiert. Ich denke, das Problem ist das name-Attribut der Input-Type-Datei, aber lass es uns überprüfen. – Rafael

+0

Es wird kein Fehler angezeigt. Es aktualisiert nur die Seite, aber nichts geht in meinen Medienordner – Jason

+0

Ok. Du hast gesagt, du bist neu in Django, richtig? Lassen Sie uns das Grundlegende überprüfen. Die 'print form.errors' sollten am Terminal erscheinen (und nicht im Browser). Wenn Sie Ihr Formular absenden, werden die anderen Informationen (Benutzer, E-Mail und Kontaktnummer) in der Datenbank angezeigt. – Rafael

Antwort

0

here, wie ich mein Problem gelöst:

ich diese Methode verwendet, um mein Bild von dem Eingang ersten

function extractPhoto(input) { 
     var files = input[0].files; 
     if (!files.length) { 
      alert('Unable to upload: no file selected'); 
      return; 
     } 
     return files[0] 
    } 

zu extrahieren dann habe ich jQuery Formdata und Ajax das extrahierte Foto meine Ansicht nach passieren

var image = $("#image"); 
     $("#uploadbutton").click(function() { 
      const form = new FormData(); 
      form.append('image', extractPhoto(image)); 

      generateCSRFToken(); 
      $.ajax({ 
       url: '/upload_photo/', 
       data: form, 
       type: "POST", 
       contentType: false, 
       processData: false, 
       success: function (data) { 
        location.reload(); 
       }, 
       error: function (data) { 

       } 

      }) 
     }); 

dann behandeln ich es in meinem views.py

def upload_photo(request): 
     if 'image' not in request.FILES: 
      return HttpResponse(status=400) 

     user = request.user 

     user.profile.profile_picture = request.FILES.get('image') 
     user.profile.save(); 

     return HttpResponse(status=200) 
Verwandte Themen