donkeyboy72
donkeyboy72

Reputation: 1943

Django 'PictureForm' object has no attribute 'save'

I'm trying to add a new feature to my existing app that let users create a profile and upload a pictures of their pets.

When a user login , he gets redirected into the profile which display his name and also he can add a picture of himself into the model which will get displayed on the profile page.

enter image description here

At the moment , I can retrieve the name into the template but I can't seem to display the user's name and upload picture at the same time.

Whenever I click Add picture , It doesn't let the user upload a picture instead I get this error

'PictureForm' object has no attribute 'save'
 pet = form.save(commit =False) ...

I could design the page to let the user upload a picture but not display the name at the same time.

I think the problem lays in my profile.html and Profile function at views.py

Parts of my views.py

@login_required     
def Profile(request):
    Person = request.user.get_profile()
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/login/')
    if request.method == "POST":
        form = PictureForm(request.POST ,request.FILE or None)
        if form.is_valid():
            pet = form.save(commit =False)
            pet.save()
    context = (
        {'Person': Person} , 
        {'form':PictureForm()}
        )
    return render_to_response('profile.html', context, context_instance=RequestContext(request))

Parts of my forms.py

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from pet.models import *

class PictureForm(forms.Form):

    class Meta:
        model = Person
        fields = ('image')

My profile.html

 {% if Person %}
 <ul>
        <li>Name : {{Person.name}} </li>
 </ul>
 {% endif %}        

 <form method="POST" enctype="multipart/form-data" "action" >
 {% csrf_token %}
    <ul>
        {{ form.as_ul }}
    </ul>
    <input type = "submit" value= "Add Picture" />
 </form>

My models.py

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

class Person(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=100)
    image = models.FileField(upload_to="images/",blank=True,null=True)


    def __unicode__(self):
        return self.name

class Pet(models.Model):
    Person = models.ForeignKey(Person)
    description = models.CharField(max_length=100)
    image = models.FileField(upload_to="images/",blank=True,null=True)

    def __unicode__(self):
        return self.description

Upvotes: 0

Views: 4615

Answers (4)

catherine
catherine

Reputation: 22808

Erase your form.save(commit=False). You will only do that if you override your save method

@login_required     
def Profile(request):
    Person = request.user.get_profile()
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/login/')
    if request.method == "POST":
        form = PictureForm(request.POST ,request.FILES)
        if form.is_valid():
            form.save()
    context = (
        {'Person': Person} , 
        {'form':PictureForm()}
        )
    return render_to_response('profile.html', context, context_instance=RequestContext(request))

UPDATE:

    [.....]
    board = Board.objects.get(board=picture.board)//remove this
    the_id = board.id //remove this

return HttpResponseRedirect(reverse('world:Boat', kwargs={'animal_id': picture.board.id })) // change the_id into picture.board.id

Upvotes: 2

Iftikhar Ali Ansari
Iftikhar Ali Ansari

Reputation: 1760

no buddy. your problem is in your model.py:

just add this function to your model

def save(self,*args, **kw):
super(PictureForm,self).save(*args, **kw)

Upvotes: 0

Daniel Roseman
Daniel Roseman

Reputation: 599450

PictureForm needs to inherit from forms.ModelForm, not forms.Form.

Upvotes: 3

Tom Christie
Tom Christie

Reputation: 33901

You have a typo. It should be request.FILES.

Upvotes: 2

Related Questions