Pergunta

I am relatively new to python and Django.

The form is displaying itself, but when i choose a file and hit save, the form just refreshes itself and the selected file in the FormField disappears and the forms says that this filed is required.

The code is :

models.py

class ScribbleMedia(models.Model):
     media = models.FileField(upload_to='photos')
     def __unicode__(self):
      return self.media
     
class Scribble(models.Model):
     body = models.TextField()
     user = models.ForeignKey(User)
     media = models.ForeignKey(ScribbleMedia)
     def __unicode__(self):
      return u'%s, %s' % (self.user.username, self.media)

class Tag(models.Model):
  name = models.CharField(max_length=64, unique= True)
  scribbles = models.ManyToManyField(Scribble)
  def __unicode__(self):
    return self.name
    

views.py

def scribbler_save_page(request):
    if request.method == 'POST':
        form = ScribbleSaveForm(request.POST)
        if form.is_valid():
            #Create or get media.
            media, dummy = ScribbleMedia.objects.get_or_create(
                media=form.cleaned_data['media']
            )
            #Create or get media.
            scribble, created=Scribble.objects.get_or_create(
                user=request.user,
                media=media
            )
            #update scribble body
            scribble.body=form.cleaned_data['body']
            # If the scibble is being updated, clear old tag list.
            if not created:
                scribble.tag_set.clear()
            # Create new tag list.
            tag_names = form.cleaned_data['tags'].split()
            for tag_name in tag_names:
                tag, dummy = Tag.objects.get_or_create(name=tag_name)
                scribble.tag_set.add(tag)
            # Save scribble to database.
            scribble.save()
            return HttpResponseRedirect ( '/user/%s/' % request.user.username
            )
    else:
        form = ScribbleSaveForm()
    variables = RequestContext (request, { 
        'form': form
    })
    return render_to_response ('scribble_save.html', variables)
    

forms.py

class ScribbleSaveForm(forms.Form):
    media=forms.FileField(
      label=u'add file',
      widget=forms.FileInput()
    )
    text=forms.CharField(
      label=u'description',
      widget=forms.Textarea()
    )
    tags=forms.CharField(
      label=u'Tags',
      required=False,
      widget=forms.TextInput(attrs={'size':64})
    )

urls.py

(r'^save/$', scribbler_save_page),

scribble_save.html

{% extends "base.html" %}
    {% block title %}Save Scribble {% endblock %}
    {% block head %}Save Scribble { % endblock % }
    {% block content %}
    <form method="post" action=".">
        {{ form.as_p }}
        <input type="submit" value="save" />
        {% csrf_token %}
    </form>
    {% endblock %}
Foi útil?

Solução

Two things you need to do specially for file uploads:

(1) Your HTML form element must include the attribute enctype with the value multipart/form-data.

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

(2) In your view, you'll find uploaded files in request.FILES instead of request.POST. To bind uploaded files to your form, pass in request.FILES as the second argument to the form constructor.

form = ScribbleSaveForm(request.POST, request.FILES)

Source: Django docs - The Forms API - Binding uploaded files to a form

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top