2015-11-24 3 views
4

Je suis incapable d'obtenir un fichier dans mon champ de fichier dans mon ModelForm. Le fichier est soumis et le nom du fichier est dans la requête POST correspondante, mais le form.is_valid() échoue car il déclare {'the_file': [u'This field is required.']}Django forms: "Ce champ est obligatoire" lorsque le fichier POSTed au champ de fichier

J'ai écrit un ModelForm pour un modèle avec un champ de fichier et une clé étrangère à un autre modèle, ainsi:

class AccountFile(models.Model): 
the_file = models.FileField(upload_to='{}/%Y/%m/%d/'.format(
    settings.MEDIA_ROOT, 
)) 
account = models.ForeignKey(
    Account, 
    blank=True, 
    null=True, 
    related_name='account_files' 

J'ai ensuite généré un formulaire pour télécharger un fichier, ainsi:

class UploadFileForm(forms.ModelForm): 
class Meta: 
    model = models.AccountFile 
    fields = ['the_file' ] 


def clean_file(self): 
    file = self.cleaned_data.get("the_file", False) 
    filetype = magic.from_buffer(file.read()) 
    if not "pdf" in filetype: 
     raise forms.ValidationError("File is not pdf.") 
    return file 

Mise en une validation très basique (qui sera prolongée!) quand je peux obtenir au moins une chose à travail.

La forme est traitée comme ceci:

if request.method == 'POST': 
    form = forms.UploadFileForm(request.POST, request.FILES) 
    if form.is_valid(): 
     handle_uploaded_file(request.FILES['file']) 
     return redirect(
      'account_url', 
      acc_manager_pk=acc_manager.pk, 
      account_pk=account.pk, 
      ) 
else: 
    form = forms.UploadFileForm() 

C'est sur Django 1.7

Répondre

14

Assurez-vous que votre formulaire a l'ensemble enctype, par exemple:

<form method="post" enctype="multipart/form-data"> 

De the docs:

Notez que request.FILES ne contient que des données si la méthode de requête POST était et le <form> qui a affiché la demande a l'attribut enctype = « multipart/form-data ». Sinon, request.FILES sera vide.

+0

Merci beaucoup! J'ai lu cette page environ 10 fois et je l'ai vu lors de la première lecture, mais je l'ai manqué tous les deux lu pour découvrir ce que j'avais manqué. Sur la prochaine erreur! –