我想创建一个formset,其中每个表单都有一个指向一组销售商品的下拉列表。
型号:
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:
formset_type = formset_factory(SalesItemFSForm, extra=0)
问题很明显,因为我似乎无法通过公司确定下拉列表的来源。
我该怎么做?
非常感谢,
更新
似乎Jingo破解了它。 :) ModelForm比Form更好。最重要的是,我必须将fields = {}
添加到SalesItemFSForm,以确保SalesItem的字段没有显示在模板中。因为我们感兴趣的是我们的下拉列表(SalesItem)。
到目前为止一切顺利。但现在我看到尽可能多的下拉列表,因为我有Salesitems。除非用户按下jquery按钮,否则它不应显示任何内容。
我认为这是问题,我们不应该传入
formset_type = modelformset_factory(SalesItem, form=SalesItemFSForm, extra=0)
因为我们的表单不需要SalesItem的任何实例。我们需要一个虚拟模型。
这就是我最初尝试用经典Formset而不是ModelFormset解决它的原因。所以那里有一半。 :)
更新2:
Jingo,好点。实际上我正在考虑自定义保存,我只看到用户通过jQuery添加了多少个表单集并将其自己保存在视图中。字面上,SalesItem是一个ManyToMany字段。但标准的M2m小部件非常糟糕。因此,我想用formset替换它,其中每个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 snippet code如何在formset中添加/删除表单。
更新3:
实际上,当像这样实例化对象时,我们只会在formset中获得一个表单,并且可以通过jquery添加更多表单。完善!!除非有更简单的方法来实现这一目标。 :)
salesitem_formsets = formset_type(queryset=SalesItem.objects.filter(pk=1))
然而,这会在请求中找回你.POST,因为你不能这样做:
salesitem_formsets = formset_type(request.POST)
仍然需要设置查询集。棘手的情况......
答案 0 :(得分:0)
我希望我理解你想要实现的目标。那么也许您可以使用ModelForm及其可用的实例:
class SalesItemFSForm(forms.ModelForm):
class Meta:
model = SalesItem
def __init__(self, *args, **kwargs):
super(SalesItemFSForm, self).__init__(*args, **kwargs)
self.sale_items = self.instance.company.salesitem_set.all()
self.fields['sales_item'] = forms.ModelChoiceField(queryset=self.sale_items)
这是未经考验的,只是一个想法。我希望这会导致正确的方向,但如果完全错误,请告诉我,我将删除我的答案,以便其他人不会混淆:)。