如何在参数的表单集内的形式通过了吗?(How to pass in a parameter to t

2019-09-21 05:42发布

我想创建一个表单集,其中每种形式都有一个下拉指向一组销售项目。

模型:

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)

这个问题变得马上清楚,因为似乎没有办法,我可以通过在公司确定的下拉源。

我应该怎么做呢?

非常感谢,

更新:

似乎极端爱国义破解它。 :)

一个工程的ModelForm比形式更好。 在它的上面我不得不添加fields = {}至SalesItemFSForm,以确保该SalesItem的字段不显示在模板了。 因为所有我们感兴趣的是我们的下拉菜单(SalesItem)。

到现在为止还挺好。 但现在我看到显示为许多的下拉列表中,因为我有Salesitems。 它不应该;吨显示任何除非用户按压一个jquery按钮。

我认为这是问题,我们不应该在传递

formset_type = modelformset_factory(SalesItem, form=SalesItemFSForm, extra=0)

因为我们的表单不需要SalesItem的任何实例。 我们需要一个假人模型。

这是我试图与经典的表单集,而不是最初ModelFormset解决它的原因。 所以,它的种类有一半。 :)

更新2:

极端爱国义,好点。 有效地我就在想一个自定义保存,在这里我只看到有多少表单集被通过jQuery用户添加和我在视图中保存的。 从字面上看SalesItem是一个多对多场。 但是标准的M2M部件是可怕的。 因此,我想与表单集,其中每个salesItem是一个下拉来取代它。 然后,用户可以尽可能多的下拉菜单(在表单集的形式)添加到页面并提交。 然后我想补充的视图之间的关系。

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 代码片段如何添加/从一个formset删除表格/。

更新3:

事实上,实例化这样的对象时,我们只会得到在该formset一种形式,可以通过jQuery添加更多。 完善!! 除非有一个更简单的方式来实现这一目标。 :)

salesitem_formsets = formset_type(queryset=SalesItem.objects.filter(pk=1))

然而,这伤愈复出狩猎您在request.POST,因为你不能只是做:

salesitem_formsets = formset_type(request.POST)

它仍然需要设置的查询集。 棘手的情况......

Answer 1:

我希望我理解你想要达到正确的目的。 那么也许你可以使用的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)

这是未经测试,虽然,只是一个想法。 我希望这通向正确的方向,但如果它完全错误的,让我知道,我会删除我的答案,让别人不会混淆:)。



文章来源: How to pass in a parameter to the form within the formset?