【问题标题】:Update several objects with formset使用 formset 更新多个对象
【发布时间】:2016-07-18 15:09:43
【问题描述】:

我是 CS 的第一年,如果我完全不清楚,请原谅我的菜鸟。

我的“产品”模型中有几个对象。现在我想更新所有对象上的相同字段,即具有不同值的“数量”字段。但是,我不想像使用 updateview 那样点击进出每个产品,而是想列出所有产品并为每个产品设置值并同时更改它们。据我所知,“FormSet”应该可以解决问题?

我的类别模型如下所示(分配给产品)

class Category(models.Model):
    category = models.CharField(max_length=30)

    def __str__(self):
        return self.category

我的产品模型如下所示:

class Product(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    category = models.ForeignKey(Category)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    stock = models.PositiveIntegerField()

    def __str__(self):
        return self.title

我更新单个产品的更新视图如下所示:

class UpdateProductView(UpdateView):
    model = Product
    form_class = ProductForm
    template_name = "product_form.html"
    success_url = '/products'

class CreateCategoryView(FormView):
    template_name = "category_form.html"
    form_class = CategoryForm

我阅读了有关 formset 的文档,但我必须承认,我对之后如何实际使用它并没有感觉更聪明.. 有人可以帮忙吗?

【问题讨论】:

    标签: django django-forms formset formsets


    【解决方案1】:

    没有在您的 Product 模型上找到 quantity 字段,但正如我所见,您想使用 ModelFormSet。

    # Generate your formset class with `modelformset_factory`
    ProductFormSetClass = modelformset_factory(Product, fields=('quantity',))
    # Now you can create your formset, bind data, etc
    formset = ProductFormSetClass(request.POST)
    formset.save()
    

    更多详情链接: https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/#model-formsets

    另外,不要忘记检查所有 modelformset_factory 参数。

    【讨论】:

    • 啊,是的,当然,我的意思是“库存”而不是数量。我是否将其定义为单独的功能,还是为此创建一个新视图?我觉得有点混乱:D
    • 它的工作方式类似于 Django 中的表单,您可以绑定数据、使用 .is_valid() 方法验证表单集中的每个表单等,但首先您应该使用工厂创建类而不是声明它。如果您真的想了解它是如何工作的,请尝试用简单的视图自己实现它。文档中的示例docs.djangoproject.com/en/1.9/topics/forms/formsets/… 然后您可以尝试使用来自django-extra-views app 的通用视图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多