【问题标题】:Django - having trouble saving filtered objectDjango - 保存过滤对象时遇到问题
【发布时间】:2012-11-03 16:20:55
【问题描述】:

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

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我最终用一个模型表重做了整个事情(并在喝了几杯咖啡后更仔细地重新阅读了文档),事情变得更加顺利。
    【解决方案2】:

    我看到的是您从数据库中获取对象并且提交表单时不仅仅是保存对象,但是您没有更新任何字段,因此您看不到 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()
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多