尝试将 QuerySet 作为初始数据传递给表单集

Posted

技术标签:

【中文标题】尝试将 QuerySet 作为初始数据传递给表单集【英文标题】:Trying to pass a QuerySet as initial data to a formset 【发布时间】:2011-10-06 22:57:24 【问题描述】:

我正在尝试为库存系统构建一个页面,该页面将允许用户更新收到的物品数量。

我想显示所有产品的表格并让用户输入收到的数量,我将发布并迭代以更新数据库。

这是我的看法:

def new_shipment(request):
    list_of_active_products = Product.objects.filter(status=1)
    ShipmentFormSet = formset_factory(ShipmentForm, extra=0)
    formset = ShipmentFormSet(initial=list_of_active_products)
    return render_to_response('inventory/new_shipment.html', 'formset': formset)

这是我的表单模型:

class ShipmentForm(forms.Form):
    sku = forms.IntegerField()
    product_name = forms.CharField(max_length=100)
    quantity = forms.IntegerField()

这是表单模板:

<form method="post" action="">
    <table>
        % for form in formset %
     form 
    % endfor %
    </table>    
    <input type="submit" />
</form>

这是我得到的错误:

渲染时捕获 AttributeError:'Product' 对象没有属性 'get'

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

从文档看来,您必须传入一个字典列表作为初始数据,而不是一个 QuerySet:

Also note that we are passing in a list of dictionaries as the initial data.

您可能希望将初始查询更改为:

list_of_active_products = Product.objects.filter(status=1).values()

这将返回一个字典列表而不是模型实例对象。

使用带有表单集的初始数据: https://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-initial-data-with-a-formset

值查询集: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values

【讨论】:

做到了。我不知道 values() 函数,所以非常感谢您的提醒。回去工作... 非常感谢。但是,您拼错了示例中的函数。应该说list_of_active_products = Product.objects.filter(status=1).values()【参考方案2】:

您也可以使用 queryset 参数。这应该有效:

formset = ShipmentFormSet(queryset=list_of_active_products)

参见。 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the-queryset

【讨论】:

OP 使用 formset_factory,而 queryset 只能使用 modelformset_factory。至少,在某些 Django 版本中,您的代码将无法运行

以上是关于尝试将 QuerySet 作为初始数据传递给表单集的主要内容,如果未能解决你的问题,请参考以下文章

通过 PHP 将 MySQL 数据传递给模态表单

Flutter如何将表单数据传递给api

如何将表单 FormSeetController 中的数据传递给 ViewController?

将默认数据传递给 Vue 表单组件

奏鸣曲管理员。如何将发布数据传递给另一个控制器

通过 Redirect 将数据传递给组件