2009-07-09 65 views
1

我從POST獲取數據,並通過這個標準片段驗證它:更改數據

entry_formset = EntryFormSet(request.POST, request.FILES, prefix='entries') 
if entry_formset.is_valid(): 
    .... 

的EntryFormSet的ModelForm覆蓋的外鍵字段的控件來呈現的文本字段。這樣,用戶可以輸入一個現有的密鑰(通過Ajax實時搜索建議),或者輸入一個新密鑰,該密鑰將被無縫添加。

我使用這個try-except塊來測試對象是否已經存在,如果沒有,我添加它。

entity_name = request.POST['entries-0-entity'] 
try: 
    entity = Entity.objects.get(name=entity_name) 
except Entity.DoesNotExist: 
    entity = Entity(name=entity_name) 
    entity.slug = slugify(entity.name) 
    entity.save() 

不過,我現在需要得到entityentry_formset。它認爲entries-0-entity是一個字符串(就是這樣);我如何直接訪問entry_formset的值,並讓它取而代之的是對象引用?

+0

問題不明確。第二個代碼段在哪裏發生?如果您發佈更多視圖,這可能會有所幫助。 – 2009-07-10 08:33:44

回答

2

我會建議爲您的表單集編寫一個輔助工廠函數,以便您可以根據數據自定義顯示小部件。像下面這樣:

def make_entry_formset(initial_obj=None, custom_widget=forms.Textarea): 
    # these will be passed as keyword arguments to the ModelChoiceField 
    field_kwargs={'widget': custom_widget, 
        'queryset': Entity.objects.all()} 
    if initial_obj is not None: 
     field_kwargs.update({'initial': initial_obj}) 
    class _EntryForm(forms.ModelForm): 
     entity = forms.ModelChoiceField(**field_kwargs) 

     class Meta: 
      model = Entry 
    return modelformset_factory(Entry, form=_EntryForm) 

然後在您的視圖代碼,你可以指定你想要的部件,以及是否綁定到初始Entity對象。如果你想再次渲染它(is_valid()塊之後)與Entity對象

formset_class = make_entry_formset(custom_widget=forms.Textarea) 
entry_formset = formset_class() 

然後:對於表單集,在這裏你只想要一個Textarea小部件,無初始選擇的初始渲染,您可以使用此已經定義,您可以使用此:

formset_class = make_entry_formset(initial_obj=entity, 
            custom_widget=forms.HiddenInput) 
entry_formset = formset_class(request.POST, request.FILES) 

你可以使用任何你喜歡的小工具,當然,但使用HiddenInput將防止最終用戶從本場的相互作用(你似乎要綁定的你看起來變量爲entity)。