Django - 无法保存过滤后的对象

时间:2012-11-03 07:53:57

标签: django django-forms

对于我的第一个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

2 个答案:

答案 0 :(得分:1)

当然,有一种方法只能使用模型中的某些字段:如Using a subset of fields on the form中完整记录的那样,您可以使用表单的Meta中的fieldsexclude属性类。

然而,正如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()
...