2011-02-06 2 views
0

Я определил модель с ManyToManyField, и я хочу, чтобы поле, чтобы показать значения, соединенные пробелами, например:Django: Как показать список значений в текстовом поле ввода?

<input type="text" name="foo" value="val1 val2 val3"/> 

я определил форму, чтобы использовать CharField представлять несколько значений:

class MyForm(ModelForm): 
    foo = CharField(label='Foo') 
    class Meta: 
     model = MyModel 

вместо того чтобы показывать значения, разделенные пробелами, значение показывает вместо этого:

[u'val1', u'val2', u'val3'] 

Как можно переопределить-й это поведение?

+0

это только для отображения, или если пользователь сможет модифицировать отношение с этой формой? –

+0

Пользователь должен иметь возможность изменять отношение. Я реализовал чистый метод, который разбивает значение и проверяет каждый элемент, и представление, которое берет очищенный вход и добавляет элементы в соответствующий набор. –

+0

Я посмотрел MultiWidget и MutliValueField, но у них, похоже, слишком много обручей, чтобы перепрыгнуть за то, что я делаю. Похоже, это должно быть очень просто ... –

ответ

0

У вас есть основное недоразумение, которое заключается в том, что сами поля не несут ответственности за то, как они отображаются. Это то, что widgets сделать.

+0

До сих пор я не нашел пример виджета, который делает то, что я описал выше. Просматривая код в widgets.py, он не делает его более ясным. –

0

Хорошо, я, наконец, понял это:

class MultiValueTextWidget(TextInput): 
    def _get_value(self, value): 
     return " ".join(value) 

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

Я попытался это раньше (до того как я разместил оригинальный вопрос), но я думаю, что было что-то не так с моей декларации поля. Она работает, когда я создаю экземпляр поле с виджетом, как это:

markets = CharField(widget=MultiValueTextWidget(), label='Ticker symbols') 

По какой-то причине я имел проблемы с этим:

class Meta: 
    widgets = { 
     'markets': MultiValueTextWidget() 
     } 
Смежные вопросы