2010-03-03 51 views
1

我已經寫了一個自定義的widget在Django定製覆蓋清潔方法窗體

class AutoCompleteWidget(widgets.TextInput): 
""" 
widget to show an autocomplete box which returns a list on nodes available to be tagged 
""" 
def render(self, name, value, attrs=None): 
    final_attrs = self.build_attrs(attrs, name=name) 

    if not self.attrs.has_key('id'): 
     final_attrs['id'] = 'id_%s' % name 

    if not value: value = '[]' 

    jquery = u""" 
    <script type="text/javascript"> 
    $("#%s").tokenInput('%s', { 
     hintText: "Enter the word", 
     noResultsText: "No results", 
     prePopulate: %s, 
     searchingText: "Searching..." 
    }); 

    $("body").focus(); 
    </script> 
    """ % (final_attrs['id'], reverse('ajax_autocomplete'), value) 

    output = super(AutoTagWidget, self).render(name, "", attrs) 

    return output + mark_safe(jquery) 

class MyForm(forms.Form): 
    AutoComplete = forms.CharField(widget=AutoCompleteWidget) 

這個小部件使用了jquery function它自動填充基於從數據庫條目的字。您可以通過表單域的inital值設置爲這個JSON字符串

jquery_string = ['name': 'some name', 'id': 'some id'] 
form = MyForm(initial={'AutoComplete':jquery_string}) 

的形式預填充設置爲一個JSON字符串預設的初始值

['name': 'some name', 'id': 'some id'] 

當我這樣做提交表單AutoComplete的值將作爲所選id的逗號分隔列表返回,例如如果我想要的話,12,45,43,66。

但是,如果表單中有錯誤,例如未輸入必填字段,則自動完成字段的值現在爲12,45,43,66,而不是它所需的json字符串。

解決此問題的最佳方法是什麼?我正在考慮覆蓋表單類中的乾淨方法,但我不知道如何找出是否有其他元素返回錯誤。例如

if forms.errors 
    form.cleaned_date['autocomplete'] = json string 

return form.cleaned_data 

感謝

回答

0

那麼,爲什麼你不能這樣做乾淨的相應字段清潔方法?

我也使用相同的技術來使用自定義小部件來生成自動填充字段。 當用戶從窗口小部件的一些結果,我的js代碼填入隱藏的「ID」字段正確的ID,然後我有這個領域的清潔方法:

def clean_category(self): 
     try: 
      category = Category.objects.get(id=int(self.cleaned_data['category'])) 
     except: 
      raise forms.ValidationError("Such category doesn't exist") 
     return category