0

对于我的第一个 Django 项目,我正在尝试制作一个应用程序,该应用程序允许用户创建媒体列表(书籍、电影等),其中包含描述每个对象(标题、作者等)的各种字段,但我无法确定出如何让它保存。也就是说,提交表单时什么也没有发生。有人可以告诉我我做错了什么吗?对不起,如果这是一个菜鸟问题;好像我在这里错过了一些非常基本的东西。(我使用的是基本的 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
4

2 回答 2

1

当然,有一种方法可以只使用模型表单中的某些字段:正如在表单中使用字段子集中完整记录的那样,您可以在表单的 Meta 类中使用fieldsorexclude属性。

但是,正如 szaman 指出的那样,您仍然需要将 POST 数据传递给表单并检查其有效性,此外,您还需要instance在更新现有实例时传入参数。

于 2012-11-03T08:20:55.243 回答
0

我看到的是您从数据库中获取对象并且提交表单时不仅仅是保存对象,但是您没有更新任何字段,因此您看不到 db.xml 中的更改。试着做:

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()
...
于 2012-11-03T08:14:06.050 回答