2012-08-15 92 views
0

我想創建一個formset,其中每個表單都有一個指向一組銷售項目的下拉菜單。如何將參數傳遞給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) 

問題變得馬上清楚,因爲似乎沒有我可以通過該公司確定下拉菜單的來源。

我該怎麼做?

非常感謝,

更新:

似乎極端愛國義破解它。 :)

ModelForm比Form更好。最重要的是,我必須將fields = {}添加到SalesItemFSForm中,以確保SalesItem的字段未顯示在模板中。因爲我們感興趣的是我們的下拉(SalesItem)。

到目前爲止這麼好。但現在我看到儘可能多的下拉菜單,因爲我有Salesitems。它不應該顯示任何,除非用戶按下jQuery按鈕。

而且我認爲這是問題,我們不應該在

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

傳因爲我們的表單不需要SalesItem的任何實例。我們需要一個虛擬模型。

這就是我最初用經典Formset而不是ModelFormset解決它的原因。所以它的一半在那裏。 :)

更新2:

極端愛國義,好點。實際上,我正在考慮自定義保存,在這裏我只看到用戶通過jQuery添加了多少個表單,並將其自己保存在視圖中。 Literally 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)) 

然而,這傷愈復出狩獵您在request.POST,因爲你不能只是做:

salesitem_formsets = formset_type(request.POST) 

它仍然需要設置的查詢集。棘手的局面......

+0

相同的一般問題,因爲http://stackoverflow.com/questions/11692190/dynamic-modelchoicefield-queryset-with-an-inline-model-formset – supervacuo 2012-08-15 18:30:34

+0

@supervacuo根本的問題是一樣的,但不同的部件工作。所以你試圖用inline-formsets解決它,很有趣,但是你似乎沒有解決這個問題的方法,對嗎? – Houman 2012-08-15 18:41:38

+0

當您實例化窗體(即:formset_type())時,您可以傳入一個空的查詢集,例如(通常是Django的「.all()」)。像:formset_type(queryset = SalesItem.objects.none())。看到這裏https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the-queryset,等待不,還是不對:/ – Jingo 2012-08-15 22:03:30

回答

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) 

這是未經測試,雖然,只是一個想法。我希望這將導致正確的方向,但如果它完全錯誤,讓我知道,我會刪除我的答案,以便別人不會困惑:)。

+0

有趣。我可以試試,但從邏輯上講它可能會有問題,因爲salesitem.company.sales_item_set.all()將與SalesItem.objects.all()相同,不是嗎?這是一個問題,因爲我想過濾給定的公司。 :)不知道...需要測試。謝謝雖然 – Houman 2012-08-15 20:05:33

+0

哎呀,聽上去不錯,不得不思考:P,更好地火了蟒蛇殼... – Jingo 2012-08-15 20:07:45

+0

至少在殼這兩個查詢集是不一樣的。你能測試嗎?我真的對結果感興趣:),因爲我試圖在編程一個小調查系統時解決一些類似的問題...... – Jingo 2012-08-15 21:00:39

相關問題