For my first Django project I’m trying to make an app that lets users create lists of media (books, movies, etc.) with various fields describing each object (title, author, etc.), and I’m having trouble figuring out how to get it to save. That is to say that nothing happens when the form is submitted. Can someone tell me what I’m doing wrong? Sorry if this is a bit of a noob question; it seems like I’m missing something really basic here. (I’m using basic HTML forms instead of ModelForms because for some media types I want to ignore certain fields – e.g. “author” for movies – but if there is an easy way to do that using ModelForms, I’m all ears.)
from views.py:
def editbook(request,list_owner,pk):
book_list = Item.objects.all().filter(item_creator=list_owner).filter(category='book').order_by('type','name')
item_to_edit = Item.objects.get(pk=pk)
if request.method == 'POST':
item_to_edit.save()
return render_to_response('books.html', {'booklist': book_list, 'listowner': list_owner}, RequestContext(request))
else:
form=EditItem()
return render_to_response('editbook.html', {'listowner': list_owner, 'item_to_edit': item_to_edit}, RequestContext(request))
from models.py:
CATEGORY_CHOICES = (
('book','book'),
('tv','tv'),
('movie','movie'),
('game','game'),
('music','music'),
)
class Item(models.Model):
item_creator = models.CharField(max_length=30) # user name goes here
category = models.CharField(max_length=5, choices=CATEGORY_CHOICES)
name = models.CharField(max_length=70)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
artist = models.CharField(max_length=70, blank=True)
type = models.CharField(max_length=50, blank=True)
progress = models.CharField(max_length=10, blank=True)
finished = models.BooleanField(default=False)
rating = models.IntegerField(default=0, blank=True, null=True)
comment = models.CharField(max_length=140, blank=True)
def __unicode__(self):
return self.name
There is, of course, a way to only use some fields in a modelform: as fully documented in Using a subset of fields on the form, you can use the
fieldsorexcludeattributes in the form’s Meta class.However you’ll still need, as szaman points out, to pass the POST data to the form and check for validity, and in addition you’ll need to pass in the
instanceparamater as you’re updating an existing instance.