Django:可以从POST/GET数据预填充的自定义小部件

Django:可以从POST/GET数据预填充的自定义小部件,django,django-forms,widget,Django,Django Forms,Widget,更新了我的最终解决方案,如下所示 我编写了一个自定义Django表单小部件来创建范围查询。它呈现两个输入字段来定义查询的最小值和最大值 使用精心制作的表单和小部件,可以用上一次查询的值填充字段,如下所示: form = my_form(request.GET) 但是,我无法找到一种方法来填充自定义小部件中这些字段的值。以下是小部件代码: class MinMax(Widget): input_type = None # Subclasses must define this.

更新了我的最终解决方案,如下所示

我编写了一个自定义Django表单小部件来创建范围查询。它呈现两个输入字段来定义查询的最小值和最大值

使用精心制作的表单和小部件,可以用上一次查询的值填充字段,如下所示:

form = my_form(request.GET)
但是,我无法找到一种方法来填充自定义小部件中这些字段的值。以下是小部件代码:

class MinMax(Widget):
    input_type = None # Subclasses must define this.

    def _format_value(self, value):
        if self.is_localized:
            return formats.localize_input(value)
        return value

    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
        if value != '':
            # Only add the 'value' attribute if a value is non-empty.
            final_attrs['value'] = force_unicode(self._format_value(value))
        return mark_safe(u'<input type="text" name="min-%s" /> to 
                            <input type="text" name="max-%s" />' % (name, name) )   

请注意,这些字段以fieldname_0、fieldname_1的形式返回(如果添加其他小部件,则以此类推)

两个问题:首先,您没有在HTML中实际设置
属性。那么,你如何期望它显示出任何价值呢?第二:当您试图创建一个接受两个值的小部件时,应该考虑使用
MultiWidget
,这就是该类的用途。试试看,看看结果如何。。如果您需要mroe帮助,请编辑答案。谢谢;我没有使用value属性,因为传递给小部件的值总是空的。
class MinMax(MultiWidget):
    def __init__(self, attrs=None):
        """ pass all these parameters to their respective widget constructors..."""
        widgets = (forms.TextInput(attrs=attrs), forms.TextInput(attrs=attrs)   )
        super(MinMax, self).__init__(widgets, attrs)

    def decompress(self, value):
        return value or ''

    def value_from_datadict(self, data, files, name):
        value = ''
        for key, value in data.items():
            value += value

    def format_output(self, rendered_widgets):
        """
        Given a list of rendered widgets (as strings), it inserts stuff
        between them.

        Returns a Unicode string representing the HTML for the whole lot.
        """
        rendered_widgets.insert(-1, ' to ')
        return u''.join(rendered_widgets)