尝试将QuerySet作为初始数据传递给formset

Sha*_*man 13 django formsets

我正在尝试为库存系统构建一个页面,允许用户更新收到的项目数量.

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

这是我的观点:

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})
Run Code Online (Sandbox Code Playgroud)

这是我的表格模型:

class ShipmentForm(forms.Form):
    sku = forms.IntegerField()
    product_name = forms.CharField(max_length=100)
    quantity = forms.IntegerField()
Run Code Online (Sandbox Code Playgroud)

这是表单模板:

<form method="post" action="">
    <table>
        {% for form in formset %}
    {{ form }}
    {% endfor %}
    </table>    
    <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

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

任何人都可以帮我解决这个问题吗?

gel*_*lej 14

您还可以使用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版本中,您的代码将无法正常工作 (2认同)

rol*_*one 12

从文档看起来你必须传入一个字典列表作为初始数据,而不是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()
Run Code Online (Sandbox Code Playgroud)

它将返回字典列表而不是模型实例对象.

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

ValuesQuerySet:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values

  • 这样做了.我没有意识到values()函数,所以非常感谢单挑.回去工作... (2认同)