Assuming your product application works as expected without Django CMS, what you'd next want to do is create your own plugin to show the form. The plugin would render your form, which you've already defined in your own application using a plugin template that you've created.
This plugin for a contact form allows the contact form to be inserted into the page template anywhere a placeholder will allow it.
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
The template would include all the HTML and Django template language necessary to render the form.
This other contact form plugin shows another example of how to do it. Instead of rendering the form it just updates the context. The upside is that you don't have to create a separate template, but the downside is that you lose some of the modularity of having a plugin. This depends on the page template rendering the form.
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
In either case you still have to define the view to accept the form submission, which means you'll need to create a view outside of the CMS acknowledging receipt of the form with its own template, redirecting the user back to the referring page, and/or accepting an AJAX request.