2015-03-03 5 views
2

Est-ce que quelqu'un sait pourquoi mon formulaire (filepicker) retourne constamment "ce champ est requis" quand il travaillait dans une version plus simple?Pourquoi mon formulaire Django dit-il "ce champ est obligatoire"

Mon point de vue est

def add_attempt(request, m_id, a_id): 
    template = loader.get_template('add_attempt.html') 
    if request.method == 'POST': 
     import pprint 
     pprint.pprint(request.POST) 
     pprint.pprint(request.FILES) 
     form = UploadAttemptForm(data=request.POST, files=request.FILES) 
     if form.is_valid(): 
      form.instance.pub_date = datetime.datetime.now() 
      form.instance.user_id = request.user 
      form.instance.assignment = m.Assignment.objects.get(id=a_id) 
      form.save() 
      return HttpResponseRedirect(reverse('assignment', args=(m_id, a_id))) 
     else: 
      print form.errors 
    else: 
     form = UploadAttemptForm() 
    context = RequestContext(request, 
     { 
     'form':form, 
     }) 
    return HttpResponse(template.render(context)) 

Mon modèle est

class Attempt(models.Model): 
    user_id = models.ForeignKey(User) 
    pdf_filename = models.FileField(storage=settings.S3_STORAGE, upload_to='pdfs') 
    pub_date = models.DateTimeField('date uploaded') 
    assignment = models.ForeignKey(Assignment) 

Et ma forme est

class UploadAttemptForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(UploadAttemptForm, self).__init__(*args, **kwargs) 

    class Meta(): 
     model = Attempt 
     fields = ['pdf_filename',] 

Les impressions d'erreur sur les

`<QueryDict: {u'submit': [u'Upload Attempt'], u'pdf_filename': [u'something.pdf']}>` 

<MultiValueDict: {}> <ul class="errorlist"><li>pdf_filename<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

+4

Avez-vous ajouté le '' enctype = multipart/form-data'' à votre élément ''

'' dans votre modèle? Si vous n'avez pas cet élément, votre '' request.FILES'' sera toujours vide. – Serafeim

+0

PARFAIT! Merci un million. Malheureusement, comme je ne comprenais pas complètement comment les formulaires fonctionnaient dans Django, je ne l'ai pas remarqué. Merci encore et si vous voulez faire une réponse complète, je vais accepter cela. – bungleofsketches

+0

Cool! J'ai ajouté une bonne réponse. J'avais utilisé un commentaire en premier lieu parce que je n'avais pas vu votre template (mais oublier '' enctype'' est une erreur commune, il m'a mordu une ou deux fois aussi) – Serafeim

Répondre

2

Ajouter mon commentaire comme une réponse appropriée:

S'il vous plaît, essayez d'ajouter enctype= multipart/form-data à votre élément <form> dans votre fichier de modèle.

Si vous ne possédez pas cet élément, votre request.FILES sera toujours vide.

Copie à partir https://docs.djangoproject.com/en/1.7/topics/http/file-uploads/#basic-file-uploads:

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

0

Si le champ est nécessaire dans votre models.py (à savoir vous ne l'avez pas dit blank=True ou null=True), et que vous utilisez un ModelForm, alors ce sera un champ obligatoire dans votre ModelForm