2012-08-02 48 views
0

我试图在自定义的问题中构建一些东西,试图使用自定义字段和自定义小部件来实现我的目标。但不幸的是,我无法找到足够的文档来指导我通过...django自定义小部件和字段作为向导中的多个按钮

在我的情况下,我试图构建向导的第一种形式,第一种形式将包括一个单一字段,我正在传递选择字典预填充来自数据库。字典看起来像这样

choices = { 
     1 : { 
      'display_name' : 'Bronze', 
      'description' : 'this package contain all the cool features and much more.', 
      }, 
     2 : { 
      'display_name' : 'Silver', 
      'description' : 'this package contain all the cool features and much less.', 
      }, 
    } 

所看到的字典包含从数据库动态提供的服务,它将在初始化时被馈送到字段。在另一方面,我需要建立一个自定义字段和窗口小部件,将填充以下HTML

<div class="choices"> 
     <div class="span3"> 
      <h2>Bronze</h2> 
      <p> 
       this package contain all the cool features and much more. 
      </p> 
      <input type="button" name="Bronze" value="1" /> 
     </div> 
     <div class="span3"> 
      <h2>Silver</h2> 
      <p> 
       this package contain all the cool features and much less. 
      </p> 
      <input type="button" name="Silver" value="2" /> 
     </div>    
    </div> 

其中每个span3代表与包描述名称和按钮行选择和移动向导中的下一步。在另一方面,我试图建立一个简单的自定义字段如下

class PackageField(forms.CharField): 
    default_error_messages = { 
     'not_valid_package': _(u'Package selected is not a valid package.'), 
    } 

    def to_python(self, value): 
     print value 
     if value in self.validators: 
      return None 
     return value 

和widget.py

class PackageWidget(MultiWidget): 
    _choices =() 
    def __init__(self, choices, attrs=None): 
     self._choices = choices 
     super(PackageWidget, self).__init__(attrs) 


    def render(self, name, value, attrs=None): 

     output = [] 

     for k, v in self._choices: 
      output.append('<div class="span3">%s<input type="button" class="btn"/></div>' % v) 

     return mark_safe(self.format_output(output)) 

,但我肯定有很多错误的与我写的自定义字段的方式和小部件,因为他们扔错误。

如果有人能指导我正确的方向如何编写一个正确的自定义字段&小部件,如果有人可以通过我参考,我可以阅读更多,这将有很大帮助,我将不胜感激。

+0

那么你的窗体是什么样的?或者你只是渲染一个Widget? – milkypostman 2012-08-02 18:59:44

+0

我的表单只包含使用其小部件呈现的单个字段..它不包含太多.. – 2012-08-02 19:10:37

回答

0

这个怎么样。对不起,重新命名了一下,但你应该能够找出差异。下一次你应该粘贴你遇到的错误等等。

此外,我不知道你需要MultiWidget这里。 Widget不会正常工作吗?我认为MultiWidget是为了当你想显示多个不同的小部件。

class Ex1Widget(forms.MultiWidget): 
    _choices =() 
    def __init__(self, choices, attrs=[]): 
     self._choices = choices 
     super(Ex1Widget, self).__init__(attrs) 


    def render(self, name, value, attrs=None): 
     output = [] 

     for k, v in self._choices: 
      output.append('<div class="span3">%s: <input type="submit" class="btn" value="x" /></div>' % v) 

     return mark_safe(self.format_output(output)) 

class Ex1Form(forms.Form): 
    test = forms.CharField(label="", widget=Ex1Widget(choices=(('this', 'This'), ('that', 'That'), ('other', 'Other Thing'),))) 
相关问题