0

我正在尝试在自定义问题中构建一些东西,从而尝试使用自定义字段和自定义小部件来实现我的目标。但不幸的是,我找不到足够的文档来指导我完成...

就我而言,我正在尝试构建向导的第一个表单,第一个表单将包含一个字段,该字段正在传递从数据库中预先填充的选择字典。字典看起来像这样

    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))

但我确信我编写自定义字段和小部件的方式存在很多错误,因为它们会抛出错误。

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

4

1 回答 1

0

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

另外,我不知道你需要在MultiWidget这里。正常Widget工作不行吗?我认为 aMultiWidget适用于您想要显示多个不同的小部件时。

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'),)))
于 2012-08-02T21:13:12.700 回答