Насколько мне может помочь django.forms? - PullRequest
0 голосов
/ 16 января 2011

У меня есть следующая модель, которая формирует отношения «многие ко многим» между людьми и публикациями «Eprint». На странице профиля каждого человека будут отображаться eprints, на которые есть ссылки в этой таблице, но только в том случае, если show = True и в числовом порядке поля 'order':

class UsersEprint(models.Model):
    person = models.ForeignKey(Person)
    eprint = models.ForeignKey(emodels.Eprint) # this has a .title field
    show = models.BooleanField(default=True)
    order = models.IntegerField(default=0)

Теперь всем этим можно управлять от администратора, но я хочу, чтобы на странице профиля пользователя на сайте появилась удобная форма.

В идеале мне нужна таблица со строкой для каждого из оттисков человека с указанием заголовка eprint (который нельзя редактировать), флажок для «show» и числовое поле для «order». Галочка 'delete' также будет полезна.

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

Следующая сложность заключается в том, что вместо нумерации пользовательских типов для изменения порядка строк таблицы я мог бы использовать систему javascript - либо перетаскивать строки или перемещать стрелки вверх / вниз. Когда пользователь отправляет форму, новый заказ получен.

У меня вопрос: в какой момент я выйду из сферы обработки форм django? Должен ли я просто отбросить импорт django.forms и управлять всем этим сам? Или есть еще полезные биты даже для самых неуклюжих форм?

Ответы [ 2 ]

1 голос
/ 16 января 2011

Я не думаю, что ваш вариант использования является особенно неловким, и я уверен, что InlineModelFormset прекрасно справится со всеми вашими требованиями. Следует помнить, что основной задачей форм Django является проверка входных данных; презентация остается (и должна быть) на ваше усмотрение.

Конечно, Django предоставляет несколько основных инструментов для разметки форм (as_ul и др.), Но вы не должны слишком зацикливаться на них. Настройка способа отображения ваших форм должна рассматриваться не как «взлом», а как функция; -)

  1. Поскольку вы не будете редактировать eprint, вы можете исключить это поле из базовой формы, которую вы перейти к inlinemodelformset_factory; в ваш шаблон, просто отобразить form.instance.eprint.title вместо из form.eprint (form.instance указывает на базовую модель Экземпляр)

  2. При рендеринге форм в Formset, вы можете проверить form.instance.show - если это True, затем визуализируйте форму обычно. В противном случае, либо добавьте «скрытый» класс для формы контейнер или визуализировать поля как скрытые входы (form.<FIELD>.as_hidden). К сожалению, вы не можете просто опустить их, так как это приведет к проверке ошибки на сервере

  3. Передача can_delete=True в inlinemodelformset_factory воля добавьте -DELETE флажок для каждого форма; Вы можете использовать JQuery, чтобы скрыть это, а вместо этого сделать удаление кнопка. При нажатии на кнопку устанавливает значение флажка и Джанго берет на себя все остальное. Ты можешь видеть пример этого здесь

  4. Заказ может быть обработан с помощью инструментарий, такой как jQuery UI - взгляните на this фрагмент для идей. Снова, прогрессивное улучшение - это то, что ты после здесь; весь ваш сценарий будет сделать это обновить order поле, и пусть Django обрабатывает фактическую экономию при отправке. Таким образом, функциональность все еще присутствует, даже если Javascript отключен (или отсутствует) на клиенте

Не бойтесь исследовать и экспериментировать. Не все Django документированы, но (используйте источник, Люк :) Если вас беспокоит зависимость от функции, которая может быть удалена когда-нибудь в будущем, вы всегда можете спросить у Django Users

1 голос
/ 16 января 2011

Нет «хорошего» ответа на этот вопрос, но лично я бы сказал, что это выходит за рамки;) Как вы говорите сами, вы можете контролировать типы полей, представленных в различных усадьбах, но они, я согласен, делаютзаставьте это чувствовать себя "грязным".

Кроме того, вы думали о html за вашей системой javascript?Какая форма вам понадобится с этим ... Как будет обрабатываться представление, если оно ожидает форму, обработанную обработкой формы в Django.Возможно, вы могли бы сделать это, но я думаю, что это стало бы очень уродливо очень быстро.

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

Позвольте мне повторить, это действительно совет, я уверенВы могли бы использовать стандартную обработку форм, но я бы не стал делать то же самое.

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