2009-06-22 42 views
0

基本上我有一個具有ManyToMany字段的模型,然後從該模型派生出一個模型,其中該字段呈現爲「多選」選擇框。在我的模板中,我省略了該字段,而是選擇在視圖中爲該字段準備值,然後將這些準備的值傳遞到request.POST(實際上是request.POST的副本,因爲request.POST是不可變的),然後向表單提供請求.POST,然後正常進行。我無法弄清楚如何做到這一點,因爲request.POST不僅僅是一個簡單的python字典,而是一個QueryDict,它的行爲有點不同。如何構建一個自定義的「列表類型」條目來請求。POST

我需要填寫的字段叫做"not_bases"。當我使用表單創建窗口小部件時,它在內部完美地工作,但不是以我喜歡的UI方式。當我檢查通過Django的方便調試錯誤窗口提交POST值Django的形式,工作的QueryDict看起來是這樣的:

<QueryDict: {u'not_bases': [u'005', u'00AR', u'00F', u'00FD'], [...] }> 

它出現"not_bases"值是一個列表,但它不是一個簡單的列表。我不能只是.append(),因爲它不起作用。我在文檔中搜索並找到.update(),其中出現工作,但沒有。這裏是我的代碼:

newPOST = request.POST.copy() 
for base in bases: 
    newPOST.update({"not_bases": base.identifier}) 

這裏是輸出:

<QueryDict: {u'not_bases': [u'KMER', u'KYIP'], u'reference': [u''], [...] }> 

但是,當我哺養的QueryDict的形式,我得到的,說:「not_bases的形式驗證錯誤:輸入列表值。「很顯然,QueryDict的str()表示形式的列表看起來不同於上述兩種情況,儘管它們看起來完全一樣

那麼,我該如何做到這一點?

+0

如果我對源代碼的理解是正確的,那麼應該可以將.append()添加到not_bases -list。你能否澄清一下你的意思是「它行不通」? – 2009-06-22 07:44:40

+0

黑客請求.POST是實現目標的錯誤方法。相反,請修改表單,使其不需要該字段,而是在保存的模型中手動設置值(或者表單對POST數據執行的任何操作)。 – 2009-06-22 15:39:10

回答

2

你真的不清楚你在這裏做什麼,但我懷疑黑客QueryDict是實現它的正確方法。

如果你想定製not_bases字段的顯示,你可以簡單地覆蓋定義您的ModelForm聲明:

class MyModelForm(forms.ModelForm): 
    not_bases = forms.ChoiceField(choices=[(base, base) for base in bases]) 

    class Meta: 
     model = MyModel 

或者,如果你只是想避免顯示的形式就可以了,你可以從表單中排除它並在驗證後設置值。

class MyModelForm(forms.ModelForm): 

    class Meta: 
     model = MyModel 
     exclude = ['not_bases'] 


.... 
if request.POST: 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.not_bases = bases 
     instance.save() 

這些都做你想做的嗎?

相關問題