tipos personalizados formularios fields ejemplos avanzados python django forms content-management-system django-cms

python - personalizados - cómo usar formularios en django-cms?



model forms django (6)

Soy un novato absoluto de django-cms. He revisado el tutorial y lo he configurado exactamente igual a como se menciona en la documentación. Ahora, tengo que crear una aplicación que use un formulario para subir productos.

No tengo ni idea de cómo seguir adelante con eso. Quiero comenzar con formularios simples como si ahora, digamos, un tipo de caja de texto de nombre de usuario y contraseña. ¿Cómo puedo usar los formularios django en la página django-cms? Tengo el complemento de fragmentos habilitado en él también. Necesito una guía para esto.

Cualquier sugerencia plsss. Gracias


Soy nuevo en django-cms también, pero la forma en que se describe ojii parece ser la más razonable:

  • Haga un CMSPlugin como se describe arriba para representar el formulario.
  • Haga que el formulario se publique en una vista enganchada estáticamente (o en una vista vista como adjunta), si el POST es exitoso, redirija a la página nuevamente si lo desea.

Sin embargo, para mí, esta es solo una solución parcial porque no solo quiero volver a dirigirme a la página cms que contiene el complemento en caso de éxito, sino también en el caso de errores de formulario que deben mostrarse. La parte de redireccionamiento no es el problema (simplemente redirijo a request.META ["HTTP_REFERER"]), pero la parte de entregar el formulario (errores) a la página cms que contiene el complemento es complicada. La única respuesta que encontré para esto: utilizo una sesión (escribir el formulario en la sesión en la vista estática y luego eliminarlo de nuevo en el método de renderizado del complemento). No es la mejor manera, pero funciona. (Habría formas mejores, si la configuración de los complementos cms soportara alguna forma de redirigir en lugar de renderizar, pero aparentemente no existe tal opción: vea http://groups.google.com/group/django-cms/browse_thread/thread / 79ab6080c80bbcb5 )



Recientemente me encontré con django-form-designer

Es bastante agradable y te permite diseñar formularios de forma asombrosa. Funciona para aplicaciones django independientes y tiene un complemento adicional para Django-CMS. Una nota: debe seguir las instrucciones independientes además de las instrucciones de instalación de Django-CMS.

De la descripción de github:

Principales características:

  • Diseñe formularios de contacto, formularios de búsqueda, etc. desde el administrador de Django, sin escribir ningún código
  • Los datos de formulario se pueden registrar y exportar CSV, enviarse por correo electrónico o reenviarse a cualquier dirección web
  • Integración con Django CMS: agregue formularios a cualquier página
  • Utiliza arrastrar y soltar para cambiar la posición de tus campos de formulario
  • Interfaz de administración completamente plegable para una mejor visión general sobre su formulario
  • Implementa muchos campos de formulario incluidos con Django (TextField, EmailField, DateField, etc.)
  • Las reglas de validación provistas por Django son totalmente configurables (longitud máxima, expresión regular, etc.)
  • Mensajes y etiquetas personalizables
  • Admite formularios POST y GET


Suponiendo que la aplicación de su producto funciona como se espera sin Django CMS, lo que desea hacer a continuación es crear su propio complemento para mostrar el formulario. El complemento generará su formulario, que ya ha definido en su propia aplicación utilizando una plantilla de complemento que ha creado.

Este complemento para un formulario de contacto permite que el formulario de contacto se inserte en la plantilla de la página en cualquier lugar que un marcador de posición lo permita.

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

La plantilla incluiría todo el lenguaje de plantilla HTML y Django necesario para representar el formulario.

Este otro complemento de formulario de contacto muestra otro ejemplo de cómo hacerlo. En lugar de renderizar la forma, simplemente actualiza el contexto. Lo bueno es que no tiene que crear una plantilla separada, pero la desventaja es que pierde parte de la modularidad de tener un complemento. Esto depende de la plantilla de página que represente el formulario.

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

En cualquier caso, aún debe definir la vista para aceptar el envío del formulario, lo que significa que deberá crear una vista fuera del CMS acusando recibo del formulario con su propia plantilla, redireccionando al usuario a la página de referencia y / o aceptando una solicitud AJAX.


En realidad, la solución propuesta por bennylope no es la forma preferida de hacerlo, ya que el uso de request.POST en un complemento puede tener efectos secundarios muy malos (por ejemplo, ¿qué pasa si el mismo complemento está dos veces en una página? ¿Y si hay varios complementos esperando? para datos POST en la misma página, esos complementos se confundirían entre sí cuando haya un POST en esa página).

Entonces la forma preferida es:

  • Haga un CMSPlugin como lo describe bennylope para representar el formulario.
  • Haga que el formulario se publique en una vista enganchada estáticamente (o en una vista vista como adjunta), si el POST es exitoso, redirija a la página nuevamente si lo desea.