尝试将 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 作为初始数据传递给表单集的主要内容,如果未能解决你的问题,请参考以下文章