Я создаю приложение для отслеживания заявок в службу поддержки, и у меня есть несколько моделей, которые я хотел бы создать на одной странице. Билеты принадлежат Клиенту через ForeignKey. Ноты также принадлежат билетам через ForeignKey. Я хотел бы иметь возможность выбрать клиента (это целый отдельный проект) ИЛИ создать нового клиента, затем создать заявку и, наконец, создать заметку, назначенную для новой заявки.
Поскольку я новичок в Django, я стараюсь работать итеративно, каждый раз пробуя новые функции. Я играл с ModelForms, но хочу скрыть некоторые поля и выполнить сложную проверку. Похоже, что уровень контроля, который я ищу, требует либо наборов форм, либо выполнения всего вручную, в комплекте с утомительной, вручную закодированной страницей-шаблоном, чего я пытаюсь избежать.
Есть какая-то прекрасная функция, которую мне не хватает? Есть ли у кого-нибудь хорошая ссылка или пример использования наборов форм? Я потратил целые выходные на документацию по API для них, но до сих пор ничего не понимаю. Это проблема дизайна, если я сломаю все вручную и закодирую?
источник
Ответы:
Это действительно не так уж сложно реализовать с помощью ModelForms . Допустим, у вас есть формы A, B и C. Вы распечатываете каждую из форм и страницу, и теперь вам нужно обработать POST.
Вот документы для пользовательской проверки.
источник
Я был примерно в такой же ситуации день назад, и вот мои 2 цента:
1) Я нашел, пожалуй, самую короткую и краткую демонстрацию записи нескольких моделей в единой форме здесь: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .
Вкратце: создайте форму для каждой модели, отправьте их обе в шаблон за один раз
<form>
, используяprefix
keyarg и проверьте дескриптор представления. Если есть зависимость, просто убедитесь, что вы сохранили «родительскую» модель перед зависимой, и используйте родительский идентификатор для внешнего ключа, прежде чем сохранять «дочернюю» модель. По ссылке есть демо.2) Возможно, это можно сделать с помощью наборов форм, но, насколько я понял, наборы форм в основном предназначены для ввода кратных одной и той же модели, которые могут быть необязательно привязаны к другой модели / моделям с помощью внешних ключей. Однако, похоже, нет опции по умолчанию для ввода данных более чем одной модели, и это не то, для чего, похоже, предназначен набор форм.
источник
У меня совсем недавно была проблема, и я только понял, как это сделать. Предполагая, что у вас есть три класса: Primary, B, C и что B, C имеют внешний ключ для первичного
Этот метод должен позволить вам выполнять любую требуемую проверку, а также создавать все три объекта на одной странице. Я также использовал javascript и скрытые поля, чтобы создать несколько объектов B, C на одной странице.
источник
MultiModelForm из
django-betterforms
удобная обертка делать то , что описано в ответ Gnudiff в . Он объединяет обычныеModelForm
s в один класс, который прозрачно (по крайней мере, для базового использования) используется как единая форма. Я скопировал пример из их документации ниже.источник
django-betterforms
и его класс MultiModelForm, прежде чем найти свой ответ. Их решение выглядит неплохо, но кажется, что оно давно не обновлялось. Вы все еще используете этот @jozxyqk? Какие-то проблемы?В настоящее время у меня есть обходной функционал (он проходит мои модульные тесты). На мой взгляд, это хорошее решение, если вы хотите добавить ограниченное количество полей из других моделей.
Я что-то упустил?
источник
«Я хочу скрыть некоторые поля и выполнить сложную проверку».
Начну со встроенного интерфейса администратора.
Создайте ModelForm, чтобы отобразить нужные поля.
Расширьте форму с помощью правил проверки внутри формы. Обычно это
clean
метод.Убедитесь, что эта часть работает достаточно хорошо.
Как только это будет сделано, вы можете отказаться от встроенного интерфейса администратора.
Затем вы можете использовать несколько частично связанных форм на одной веб-странице. Это набор шаблонов для представления всех форм на одной странице.
Затем вам нужно написать функцию просмотра, чтобы читать и проверять различные элементы формы и выполнять различные функции save ().
«Это проблема дизайна, если я сломаю все вручную и кодирую все вручную?» Нет, это просто много времени без особой пользы.
источник
Согласно документации Django, встроенные наборы форм предназначены для этой цели: «Встроенные наборы форм - это небольшой уровень абстракции поверх наборов форм модели. Они упрощают работу со связанными объектами через внешний ключ».
См. Https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets
источник