2012-07-24 62 views
3

我想使用我使用jquery ui創建的自動填充小部件來填充表單中的文本輸入。除了表單提交之外,一切都按照我想要的方式工作。Django表單不會因爲自動填充小部件字段而提交

問題是,當我提交表單時,文本輸入會自動重置(我不知道爲什麼),之後,頁面重新加載說該字段是必需的(只是驗證工作應該如何) 。當然,如果不重置場地,一切都會好起來的。

我不知道如果我的自動完成功能的選擇時工作正常,這裏是代碼:

select : function (e, ui) { 
    // I create a new attribute to store de database primary key of this option. This is 
    // usefull later on. 
    $('#%(input_id)s').attr('itemid', ui.item.real_value); 

    // I set the input text value's. 
    $('#%(input_id)s').val(ui.item.label); 
} 

這裏是自動完成的全碼:

class AutocompleteTextInputWidget (forms.TextInput): 

    def media(self): 
    js = ("/js/autocomplete.js", "pepe.js") 

    def __init__(self, source, options={}, attrs={}): 
    self.options = None 
    self.attrs = {'autocomplete': 'off'} 
    self.source = source 
    self.minLength = 1 
    self.delay = 0 
    if len(options) > 0: 
     self.options = JSONEncoder().encode(options) 

    self.attrs.update(attrs) 

    def render(self, name, value=None, attrs=None): 
    final_attrs = self.build_attrs(attrs)   
    options = '' 

    if value: 
     final_attrs['value'] = escape(value) 

    if isinstance(self.source, list) or isinstance(self.source, tuple): 
     # Crea un Json con las opciones. 
     source = '[' 
     for i in range(0, len(self.source)): 
      if i > 0: 
       source += ', ' 
      source += '"' + self.source[i] + '"' 
     source += ']' 

     options = u''' 
      delay : %(delay)d, 
      minLength : %(minlength)s, 
      source : %(source)s 
     ''' % { 
       'delay' : self.delay, 
       'minlength' : self.minLength, 
       'source' : source 
     } 

    elif isinstance(self.source, str): 
     options = u''' 
      delay : %(delay)d, 
      minLength : %(minlength)s, 
      source : function (request, response) { 
       if ($(this).data('xhr')) { 
        $(this).data('xhr').abort(); 
       } 
       $(this).data('xhr', $.ajax({ 
        url : "%(source_url)s", 
        dataType : "json", 
        data : {term : request.term}, 
        beforeSend : function(xhr, settings) { 
         $('#%(input_id)s').removeAttr('itemid'); 
        }, 
        success : function(data) { 
         if (data != 'CACHE_MISS') { 
          response($.map(data, function(item) { 
           return { 
            label : item[1], 
            value: item[1], 
            real_value : item[0] 
           }; 
          })); 
         } 
        }, 
       })) 
      }, 
      select : function (e, ui) { 
       $('#%(input_id)s').attr('itemid', ui.item.real_value); 
       $('#%(input_id)s').val(ui.item.label); 
      } 
     ''' % { 
       'delay' : self.delay, 
       'minlength' : self.delay, 
       'source_url' : self.source, 
       'input_id' : final_attrs['id'], 
     } 
    if not self.attrs.has_key('id'): 
     final_attrs['id'] = 'id_%s' % name  

    return mark_safe(u''' 
     <input type="text" %(attrs)s/> 
     <script type="text/javascript"> 
      $("#%(input_id)s").autocomplete({ 
       %(options)s 
      }); 
     </script> 
    ''' % { 
      'attrs' : flatatt(final_attrs), 
      'options' : options, 
      'input_id' : final_attrs['id'] 
    }) 

提示:如果我寫一些文本而沒有從自動完成中選擇它,它仍然會失敗。

另一個提示:如果我將字段設置爲可選,它將到達視圖爲空。

當我提交表單時,我應該怎麼做才能做到這一點?我花了數小時嘗試 使這項工作。我怎樣才能讓表格認識到我已經填補了這個領域?

這裏是形式的代碼:

test = forms.CharField(label = "autotest", widget = AutocompleteTextInputWidget('/myjsonservice')) 

這是呈現的HTML:

<input type="text" autocomplete="off" id="id_test"/> 
     <script type="text/javascript"> 
      $("#id_test").autocomplete({ 

      delay : 0, 
      minLength : 0, 
      source : function (request, response) { 
       if ($(this).data('xhr')) { 
        $(this).data('xhr').abort(); 
       } 
       $(this).data('xhr', $.ajax({ 
        url : "/myjsonservice", 
        dataType : "json", 
        data : {term : request.term}, 
        beforeSend : function(xhr, settings) { 
         $('#id_test').removeAttr('itemid'); 
        }, 
        success : function(data) { 
         if (data != 'CACHE_MISS') { 
          response($.map(data, function(item) { 
           return { 
            label : item[1], 
            value: item[1], 
            real_value : item[0] 
           }; 
          })); 
         } 
        }, 
       })) 
      }, 
      select : function (e, ui) { 
       $('#id_test').attr('itemid', ui.item.real_value); 
       $('#id_test').val(ui.item.label); 
      } 

      }); 
     </script> 
+1

你能發佈你的html表單和你的視圖代碼嗎? – Jingo 2012-07-25 01:15:10

回答

3

終於找到了答案,問題是,「name」屬性未被賦予。因此,該領域不能作爲請求的一部分來看待。

的自動完成構件的最終代碼弄成這個樣子:

class AutocompleteTextInputWidget (forms.TextInput): 

    def media(self): 
     js = ("/js/autocomplete.js", "pepe.js") 

    def __init__(self, source, options={}, attrs={}): 
     self.options = None 
     self.attrs = {'autocomplete': 'off'} 
     self.source = source 
     self.minLength = 1 
     self.delay = 0 
     if len(options) > 0: 
      self.options = JSONEncoder().encode(options) 

     self.attrs.update(attrs) 

    def render(self, name, value=None, attrs=None): 
     final_attrs = self.build_attrs(attrs)  
     options = '' 

     if value: 
      final_attrs['value'] = escape(value) 

     if isinstance(self.source, list) or isinstance(self.source, tuple): 
      # Crea un Json con las opciones. 
      source = '[' 
      for i in range(0, len(self.source)): 
       if i > 0: 
        source += ', ' 
       source += '"' + self.source[i] + '"' 
      source += ']' 

      options = u''' 
       delay : %(delay)d, 
       minLength : %(minlength)s, 
       source : %(source)s 
      ''' % { 
        'delay' : self.delay, 
        'minlength' : self.minLength, 
        'source' : source 
      } 

     elif isinstance(self.source, str): 
      options = u''' 
       delay : %(delay)d, 
       minLength : %(minlength)s, 
       source : function (request, response) { 
        if ($(this).data('xhr')) { 
         $(this).data('xhr').abort(); 
        } 
        $(this).data('xhr', $.ajax({ 
         url : "%(source_url)s", 
         dataType : "json", 
         data : {term : request.term}, 
         beforeSend : function(xhr, settings) { 
          $('#%(input_id)s').removeAttr('itemid'); 
         }, 
         success : function(data) { 
          if (data != 'CACHE_MISS') { 
           response($.map(data, function(item) { 
            return { 
             label : item[1], 
             value: item[1], 
             real_value : item[0] 
            }; 
           })); 
          } 
         }, 
        })) 
       }, 
       select : function (e, ui) { 
        $('#%(input_id)s').attr('itemid', ui.item.real_value); 
        $('#%(input_id)s').val(ui.item.label); 
       } 
      ''' % { 
        'delay' : self.delay, 
        'minlength' : self.delay, 
        'source_url' : self.source, 
        'input_id' : final_attrs['id'], 
      } 
     if not self.attrs.has_key('id'): 
      final_attrs['id'] = 'id_%s' % name  

     return mark_safe(u''' 
      <input type="text" name="%(name)s" %(attrs)s/> 
      <script type="text/javascript"> 
       $("#%(input_id)s").autocomplete({ 
        %(options)s 
       }); 
      </script> 
     ''' % { 
       'attrs' : flatatt(final_attrs), 
       'options' : options, 
       'input_id' : final_attrs['id'], 
       'name' : name 
     }) 
  1. 如果有人知道如何改進這個亂碼這將是很好。
  2. 如果有人知道django 1.4的一個很好的小部件文檔(除了官方的,這很糟糕),這也會很好。

再見,好的編碼大家!!!

相關問題