Обновлено с моим окончательным решением, ниже.
Я написал собственный виджет формы 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) )
Возможно, из-за имен пользовательских полей ввода значения недоступны. Есть ли способ их маршрутизации или способ переписать виджет, чтобы включить эту полезную функциональность? Одно решение, не связанное с виджетами, о котором я могу подумать, это некоторая простая логика jquery, но это далеко не оптимально.
Вот код, который я использовал в итоге:
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)
Обратите внимание, что эти поля возвращаются как fieldname_0, fieldname_1 (и так далее, если вы добавляете дополнительные виджеты).