我想创建一个表单集,其中每个表单都有一个指向一组销售项目的下拉列表。
模型:
class SalesItem(models.Model):
item_description = models.CharField(max_length=40)
company = models.ForeignKey(Company)
在这里我创建了一个带有下拉列表的表单,希望将公司作为下拉列表的来源。坚持这个想法,因为我认为这在我的场景中是不可能的。
形式:
class SalesItemFSForm(Form):
sales_item = forms.ModelChoiceField(required=False, queryset = '')
def __init__(self, company, *args, **kwargs):
super(SalesItemFSForm, self).__init__(*args, **kwargs)
self.fields.sales_item.queryset = company.salesitem_set.all()
现在在我看来,我想用这个表单创建一个表单集:
formset_type = formset_factory(SalesItemFSForm, extra=0)
问题马上就清楚了,因为我似乎无法通过公司来确定下拉菜单的来源。
我该怎么做?
非常感谢,
更新:
金戈似乎破解了它。:)
ModelForm 比 Form 更有效。最重要的是,我必须添加fields = {}
到 SalesItemFSForm,以确保 SalesItem 的字段没有显示在模板中。因为我们感兴趣的只是我们的下拉列表(SalesItem)。
到目前为止,一切都很好。但现在我看到显示的下拉菜单与销售项目一样多。它不应该显示任何内容,除非用户按下 jquery 按钮。
我认为这是问题所在,我们不应该通过
formset_type = modelformset_factory(SalesItem, form=SalesItemFSForm, extra=0)
因为我们的表单不需要任何 SalesItem 实例。我们需要一个虚拟模型。
这就是我最初尝试使用经典 Formset 而不是 ModelFormset 来解决它的原因。所以它有点一半。:)
更新 2:
金戈,说得好。实际上,我正在考虑自定义保存,在这里我只看到用户通过 jQuery 添加了多少表单集并将其保存在视图中。从字面上看,SalesItem 是一个多对多字段。但是标准的 M2m 小部件是可怕的。因此,我想用表单集替换它,其中每个 salesItem 都是一个下拉列表。然后,用户可以向页面添加尽可能多的下拉列表(formset 中的表单)并提交它们。然后我会在视图中添加关系。
class DealType(models.Model):
deal_name = models.CharField(_(u"Deal Name"), max_length=40)
sales_item = models.ManyToManyField(SalesItem)
price = models.DecimalField(decimal_places=2, max_digits=12)
希望这可以说清楚。也许有一种更简单的方法可以做到这一点。:)
顺便说一句,我还发现了这个优秀的 jquery片段代码如何在表单集中添加/删除表单。
更新 3:
实际上,当像这样实例化对象时,我们只会在表单集中获得一个表单,并且可以通过 jquery 添加更多表单。完美的!!除非有更简单的方法来实现这一点。:)
salesitem_formsets = formset_type(queryset=SalesItem.objects.filter(pk=1))
但是,这会在 request.POST 中重新搜索您,因为您不能只做:
salesitem_formsets = formset_type(request.POST)
它仍然需要设置查询集。棘手的情况...