2016-11-12 3 views
1

Ich versuche, Dateien (insbesondere Bilder) in eine Datenbank hochzuladen. Wenn ich versuche, meine Form POST in profile_photo.html (im Anhang unten), es gibt mir eine Fehlermeldung,: MultiValueDictKeyError at /user_profile/login/upload_profile_photo/Kann POST nicht korrekt beim Senden von Formular in Django

profile_photo.html:

<body> 
<div id="blue_background_with_fibers"> 
    <form class="pull-center white form-signin" role="form" action="" method="POST" enctype="multipart/form-data"> 
     {% csrf_token %} {{ form.as_p }} 
     <button class="aqua button2" type="submit" value="OK">Upload</button> 
    </form> 
</div> 

detail.html, die verwendet profile_photo.html :

<div class="modal fade" id="profile" role="dialog"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal">&times;</button> 
       <h4 class="modal-title">Upload Profile Picture</h4> 
      </div> 
      <div class="modal-body"> 
       <form> 
        <!--Insert form here--> 
        <iframe src="upload_profile_photo/" allowTransparency="true" scrolling="yes" frameborder="0" width="560px" height="175px"></iframe> 
       </form> 
      </div> 
      <div class="modal-footer"> 
       <span>Ekho © 2016</span> 
      </div> 
     </div> 
    </div> 
</div> 

ich glaube, dass ich in meinem views.py (sp bin vermasselt ausdrücklich unter der EditProfileView Klasse). Unten ist mein views.py:

class EditProfileView(View): 
form_class = EditProfileForm 

def get(self, request): 
    form = self.form_class(None); 
    return render(request, 'ekho/profile_photo.html', {'form': form}) 

def post(self, request): 
    if not request.user.is_authenticated(): 
     return render(request, 'ekho/login.html') 
    else: 
     form = EditProfileForm(request.POST or None, request.FILES or None) 
     if form.is_valid(): 
      user = form.save(commit=False) 
      user.user = request.user 
      user.profile_photo = request.FILES['profile_photo'] 
      file_type = user.profile_photo.url.split('.')[-1] 
      file_type = file_type.lower() 
      if file_type not in IMAGE_FILE_TYPES: 
       context = { 
        'user': user, 
        'form': form, 
        'error_message': 'Image file must be PNG, JPG, or JPEG', 
       } 
       return render(request, 'ekho/detail.html', context) 
      user.save() 
      return render(request, 'ekho/login.html', {'user': user}) 
     return render(request, 'ekho/detail.html', {"form": form,}) 

Models.py:

from django.db import models 
from django.contrib.auth.models import User 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile'); 
    background = models.FileField(upload_to = 'user_profile/media/', blank=True, null=True); 
    profile = models.FileField(upload_to = 'user_profile/media/', blank=True, null=True); 
    about = models.TextField(default='', blank=True); 
    reviews = models.TextField(default='', blank=True); 

    def __str__(self): 
     return self.user.username 

Und schließlich urls.py:

from django.conf.urls import url 
from . import views 

app_name = 'user_profile' 

urlpatterns = [ 
# /user_profile/ 
url(r'^$', views.index, name='index'), 

# /user_profile/username 
url(r'^user_profile/detail/$', views.detail, name='detail'), 

# user_profile/register/ 
url(r'^register/$', views.RegisterFormView.as_view(), name='register'), 

# user_profile/login/ 
url(r'^login/$', views.LoginFormView.as_view(), name='login'), 

url(r'^login/upload_profile_photo/$', views.EditProfileView.as_view(), name='edit_profile') 

]

+0

würden Sie bitte fügen Sie Ihren Stack Spur als auch? Es würde helfen, zu untersuchen, welche Zeile Sie den Fehler – Enix

+0

Der Code zum Überprüfen des Dateityps sollte eigentlich in das Formular selbst, in einem clean_fieldname-Methode sein. –

+0

@Enix Sie können den Stack Stace hier anzeigen: http://dpaste.com/1MPBNY4# –

Antwort

0

Dies aber das Problem sein In Ihre views.py-Datei, die Sie versuchen, auf 'profile_photo' zuzugreifen, die in Ihrem Profil in 'Profil' sein sollte ls.py

views.py

user.profile_photo = request.FILES['profile_photo'] 

Dieser Fehler tritt auf, wenn MultiValueDictKeyError Sie versuchen, den Schlüssel zuzugreifen, die in Dict nicht verfügbar ist

Ich denke, das

funktionieren sollte

views.py

+0

Danke, dass du diesen Fehler angezeigt hast, der den MultiKeyDictError gelöst hat, aber ich bekomme jetzt ein neues Problem, wo er die vorgenommenen Änderungen nicht speichern kann. Dies passiert, wenn ich 'user.save()' in 'views.py' schreibe. Der spezifische Fehler, der zurückgegeben wird, lautet: "UNIQUE constraint failed: user_profile_userprofile.user_id" –

0

Für Ihre zweite Problem: UNIQUE constraint failed: user_profile_userprofile.user_id

Sie können nicht form.save verwenden, um die UserProfile Instanz abzurufen. Es wird ein anderes Benutzerprofilobjekt nach dem Aufruf form.save erstellen, so erhalten Sie UNIQUE constraint error.

Versuchen form.save mit ersetzen:

user = User.objects.get(pk=request.user.pk).profile