Как использовать формы в django-cms?
Я - абсолютный новичок в django-cms. Я прошел учебник и настроил его точно так же, как указано в документации. Теперь я должен создать приложение, которое использует форму для загрузки продуктов.
Я не знаю, как двигаться дальше. Я хочу начать с простых форм, как если бы теперь, скажем, текстовое поле имени пользователя и пароля. Как я могу использовать формы django на странице django-cms? У меня есть плагин snippet. Мне нужно некоторое руководство для этого.
Любые предложения plsss.
спасибо
Ответы
Ответ 1
Недавно я столкнулся с django-form-designer
Это довольно хорошо и позволяет вам создавать формы в wysiwyg образом. Работает для автономных приложений django и имеет дополнительный плагин для Django-CMS. Одна заметка: вам нужно следовать отдельным инструкциям в дополнение к инструкциям Django-CMS для установки.
Из описания github:
Основные возможности:
- Конструировать контактные формы, формы поиска и т.д. от администратора Django без написания кода
- Данные формы могут регистрироваться и экспортироваться CSV, отправляться по электронной почте или пересылаться на любой веб-адрес
- Интеграция с Django CMS: добавление форм на любую страницу
- Используйте перетаскивание, чтобы изменить положение полей формы.
- Полностью разборный интерфейс администратора для лучшего обзора по вашей форме.
- Реализует много полей форм, включенных в Django (TextField, EmailField, DateField и т.д.).
- Правила проверки, предоставленные Django, полностью настраиваются (максимальная длина, регулярное выражение и т.д.)
- Настраиваемые сообщения и метки
- Поддерживает формы POST и GET
Ответ 2
Фактически решение, предложенное bennylope, не является предпочтительным способом сделать это, поскольку использование request.POST в плагине может иметь очень плохие побочные эффекты (например: что если тот же плагин дважды на странице? Или что, если несколько плагинов ждут POST-данных на одной странице? Эти плагины будут путать друг друга, когда на этой странице будет POST.)
Таким образом, предпочтительный способ:
- Создайте CMSPlugin как описано, с помощью bennylope, чтобы отобразить форму.
- Сделайте сообщение формы в статически подключенном представлении (или в виде apphooked), если POST будет успешным, перенаправляйте страницу снова, если хотите.
Ответ 3
Предполагая, что ваше приложение-продукт работает так, как ожидалось, без Django CMS, то, что вам нужно сделать, это создать свой собственный плагин для отображения формы. Плагин отобразит вашу форму, которую вы уже определили в своем собственном приложении, используя шаблон плагина, который вы создали.
Этот плагин для контактной формы позволяет вставить контактную форму в шаблон страницы в любом месте, где это позволит заполнитель.
class ContactPlugin(CMSPluginBase):
"""Enables latest event to be rendered in CMS"""
model = CMSPlugin
name = "Form: Contact"
render_template = "contact_form/contact_plugin.html"
def render(self, context, instance, placeholder):
request = context['request']
context.update({
'instance': instance,
'placeholder': placeholder,
'form': ContactForm(request=request),
})
return context
Шаблон будет содержать все HTML и язык шаблона Django, необходимые для визуализации формы.
В этом другом плагине контактной формы показан другой пример того, как это сделать. Вместо рендеринга формы он просто обновляет контекст. Положительным моментом является то, что вам не нужно создавать отдельный шаблон, но недостатком является то, что вы теряете часть модульности наличия плагина. Это зависит от шаблона страницы, отображающего форму.
class ContactPlugin(CMSPluginBase):
model = Contact
name = _("Contact Form")
render_template = "contact.html"
def render(self, context, instance, placeholder):
request = context['request']
if request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
form.send(instance.site_email)
context.update( {
'contact': instance,
})
return context
else:
form = ContactForm()
context.update({
'contact': instance,
'form': form,
})
return context
В любом случае вам все равно нужно определить представление, чтобы принять отправку формы, что означает, что вам нужно будет создать представление за пределами CMS, подтверждающее получение формы со своим собственным шаблоном, перенаправляя пользователя обратно на ссылку страницы и/или принятия запроса AJAX.
Ответ 4
Я тоже новичок в django-cms, но способ описания ojii кажется самым разумным:
- Сделайте CMSPlugin, как описано выше, для визуализации формы.
- Сделайте сообщение формы в статически подключенном представлении (или в виде apphooked), если POST будет успешным, перенаправляйте страницу снова, если хотите.
Однако для меня это только частичное решение, потому что я не только хочу перенаправить на страницу cms, содержащую плагин, в случае успеха, но также и в случае ошибок формы, которые необходимо отобразить. Перенаправляющая часть не является проблемой (я просто перенаправляю обратно на request.META [ "HTTP_REFERER" ]), но часть передачи формы (ошибок) на страницу cms, содержащую плагин, сложна.
Единственный ответ, который я нашел для этого: я использую сеанс (запись формы в сеанс в статическом представлении, а затем удаление его снова в методе визуализации плагина). Не самый приятный способ, но он работает. (Было бы лучше, если бы конфигурация плагинов cms поддерживала бы какой-то способ перенаправления вместо рендеринга, но, по-видимому, такой опции нет: см. http://groups.google.com/group/django-cms/browse_thread/thread/79ab6080c80bbcb5)
Ответ 5
Это может быть слишком поздно, но у меня была аналогичная проблема, поэтому я создал более общий плагин: https://github.com/metzlar/cms-form-plugin, который, оказывается, очень аналогично ответу на bennylope.
Ответ 6
Вы можете обойти это, выбросив исключение и поймав его в промежуточном программном обеспечении:
http://djangosnippets.org/snippets/2541/