В Django, как сохранить несколько полей формы в одном поле модели в виде списка значений с помощью ModelForm? - PullRequest
2 голосов
/ 17 марта 2011

Дано:

from django.db import models
class MyModel(models.Model):
    ...
    owners = models.CharField(max_length=255, blank=False)

, где owners - это список адресов электронной почты, разделенных каналом.

На странице есть несколько полей <input> с одинаковыми name, поэтому сервер получает значения в массиве.

HTML-код формы был создан вручную и не использует встроенные шаблоны (например, form.as_p).

Может ли Django ModelForm s обрабатывать что-то вроде этого?

Каково правильное расположение для обработки преобразования данных, как при извлечении модели (я должен сделать пользовательский models.Manager?), Так и когдасохранить его (какой метод save() мне переопределить? Model или ModelForm)?

- ОБНОВЛЕНИЕ ДЛЯ УТОЧНЕНИЯ -

В базе данных:

+-----+---------------------------+-----+
| ... |           owners          | ... |
+-----+---------------------------+-----+
| ... | "a@a.com|b@b.com|c@c.com" | ... |
+-----+---------------------------+-----+

Форма:

<form ... >
    ...
    <input type="text" name="owners" />
    <input type="text" name="owners" />
    <input type="text" name="owners" />
    ...
</form>

Ответы [ 2 ]

9 голосов
/ 17 марта 2011

Вы можете использовать forms.MultiValueField и forms.MultiWidget. MultiValueField знает, что одно поле вашей модели содержит несколько дискретных значений, а виджет MultiWidget знает, как должно быть представлено каждое дискретное значение. Они будут обрабатывать создание уникальных имен для ваших полей, чтобы они могли реконструировать форму из значений POST, и вам не придется переопределять любые методы формы, обеспечивающие реализацию, т.е. вам не придется переопределять save().

Как видите, официальные документы по этой теме немного тонкие. Я предлагаю вам взглянуть на код, чтобы выяснить, как все подключено и что вызывается, когда ваши требования всегда будут нуждаться в уникальном решении, а именно: сколько электронных писем будет содержать поле? Точно два, так что я могу указать два CharField виджета вручную, или это будет между 0-2, поэтому мне нужно динамически конструировать все в зависимости от переданного значения? Если вам нужен хороший пример в качестве начальной ссылки, посмотрите этот вопрос SO , в котором содержится простая и понятная реализация.

В идеале вам нужно иметь PipedEmailAddressesField, который расширяет CharField, в качестве поля вашей модели, которое знает, что оно хранит адреса электронной почты. Он должен иметь возможность создавать свое собственное соответствующее поле формы MultiValueField, которое, в свою очередь, должно создавать свое собственное соответствующее поле MultiWidget.

1 голос
/ 17 марта 2011

Вот пример сохранения модели в виде: http://themorgue.org/blog/2008/05/14/django-and-modelform/ Вы можете получить дополнительные поля вручную, используя request.POST['fieldname'] Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...