我正在尝试使用自定义字段和自定义窗口小部件来实现我的目标。但不幸的是,我找不到足够的文件来指导我......
在我的情况下,我试图构建向导的第一种形式,第一种形式将包含一个字段,它传递从数据库预先填充的选择字典。字典看起来像这样
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))
但是我确定我编写自定义字段和小部件的方式存在很多错误,因为它们会抛出错误。
如果有人可以指导我如何编写正确的自定义字段&amp;小部件,如果有人可以通过我的参考,我可以阅读更多,这将有很大帮助。
答案 0 :(得分: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'),)))