对于我的第一个Django项目,我正在尝试创建一个应用程序,让用户创建媒体列表(书籍,电影等),其中包含描述每个对象(标题,作者等)的各种字段,而我是难以弄清楚如何保存它。也就是说,提交表单时没有任何反应。有人能告诉我我做错了什么吗?对不起,如果这是一个noob问题;好像我在这里遗漏了一些非常基本的东西。 (我使用的是基本的HTML表单而不是ModelForms,因为对于某些媒体类型,我想忽略某些字段 - 例如电影的“作者” - 但如果有一种简单的方法可以使用ModelForms,那我就听见了。)
来自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))
来自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
答案 0 :(得分:1)
当然,有一种方法只能使用模型中的某些字段:如Using a subset of fields on the form中完整记录的那样,您可以使用表单的Meta中的fields
或exclude
属性类。
然而,正如szaman指出的那样,你仍然需要将POST数据传递给表单并检查有效性,此外,当你要更新时,你需要传递instance
参数现有的实例。
答案 1 :(得分:0)
我看到的是,您从数据库获取对象以及何时提交表单而不仅仅是保存对象,但您不更新任何字段,因此您无法看到db中的更改。尝试做:
if request.method == "POST":
form = MyForm(request.POST)
logging.info("form.is_valid() %s" % form.is_valid())
if form.is_valid():
item_to_edit.name = form.cleaned_data['name']
item_to_edit.save()
...