我想創建一個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)
它仍然需要設置的查詢集。棘手的局面......
相同的一般問題,因爲http://stackoverflow.com/questions/11692190/dynamic-modelchoicefield-queryset-with-an-inline-model-formset – supervacuo 2012-08-15 18:30:34
@supervacuo根本的問題是一樣的,但不同的部件工作。所以你試圖用inline-formsets解決它,很有趣,但是你似乎沒有解決這個問題的方法,對嗎? – Houman 2012-08-15 18:41:38
當您實例化窗體(即: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