2012-07-24 63 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的一个很好的小部件文档(除了官方的,这很糟糕),这也会很好。

再见,好的编码大家!!!

相关问题