как использовать формы в django-cms? - PullRequest
14 голосов
/ 26 марта 2011

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

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

Любые предложения, пожалуйста. спасибо

Ответы [ 6 ]

15 голосов
/ 26 марта 2011

На самом деле решение , предложенное bennylope, не является предпочтительным способом сделать это, так как использование request.POST в плагине может иметь очень плохие побочные эффекты (например: что, если один и тот же плагин находится дважды настраница? Или что, если на одной странице есть несколько плагинов, ожидающих данных POST? Эти плагины будут путать друг друга, когда есть POST для этой страницы).

Поэтому предпочтительный способ:

  • Создайте CMSPlugin как описано с помощью bennylope для рендеринга формы.
  • Сделайте публикацию формы в статически подключенном представлении (или в представлении с привязкой), еслиPOST успешен, перенаправьте на страницу еще раз, если хотите.
6 голосов
/ 26 марта 2011

При условии, что приложение вашего продукта работает как положено без 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.

5 голосов
/ 29 января 2012

Я недавно наткнулся на django-form-designer

Это довольно красиво и позволяет вам создавать формы в манере wysiwyg. Работает для автономных приложений django и имеет дополнительный плагин для Django-CMS. Одно замечание: вы должны следовать автономным инструкциям в дополнение к инструкциям Django-CMS для установки.

Из описания github:

Основные характеристики:

  • Создание контактных форм, форм поиска и т. Д. От администратора Django без написания кода
  • Данные формы могут быть зарегистрированы и экспортированы в CSV, отправлены по электронной почте или отправлены на любой веб-адрес
  • Интеграция с Django CMS: добавление форм на любую страницу
  • Используйте перетаскивание, чтобы изменить положение полей формы
  • Полностью складной интерфейс администратора для лучшего обзора формы
  • Реализует множество полей формы, включенных в Django (TextField, EmailField, DateField и т. Д.)
  • Правила проверки, предоставляемые Django, полностью настраиваются (максимальная длина, регулярное выражение и т. Д.)
  • Настраиваемые сообщения и метки
  • Поддерживает POST и GET формы
5 голосов
/ 17 мая 2011

Я также новичок в django-cms, но описанный способ ojii кажется наиболее разумным:

  • Создайте CMSPlugin, как описано выше, для визуализации формы.
  • Публикация формы в статически подключенном представлении (или в представлении с привязкой), если проверка POST прошла успешно, перенаправьте на страницу еще раз, если хотите.

Однакодля меня это только частичное решение, потому что я хочу не только перенаправить обратно на страницу cms, содержащую плагин, в случае успеха, но и в случае ошибок формы, которые необходимо отобразить.Перенаправление не является проблемой (я просто перенаправляю обратно на request.META ["HTTP_REFERER"]), но часть передачи формы (ошибки) на страницу cms, содержащую плагин, является сложной.Единственный ответ, который я нашел для этого: я использую сессию (записываю форму в сессию в статическом представлении, а затем снова удаляю ее в методе рендеринга плагина).Не самый хороший способ, но это работает.(Были бы лучшие способы, если бы конфигурация плагинов cms поддерживала какой-либо способ перенаправления вместо рендеринга, но, по-видимому, такой опции нет: см. http://groups.google.com/group/django-cms/browse_thread/thread/79ab6080c80bbcb5)

2 голосов
/ 31 января 2014

Это может быть слишком поздно, но у меня была похожая проблема, поэтому я создал более общий плагин: https://github.com/metzlar/cms-form-plugin, который очень похож на ответ bennylope.

1 голос
/ 06 сентября 2011

Вы можете обойти это, выдав исключение и поймав его в промежуточном ПО: http://djangosnippets.org/snippets/2541/

...