如何在django-cms中使用表单?

时间:2011-03-26 15:04:57

标签: python django forms content-management-system django-cms

我是django-cms的绝对新手。我已经完成了教程,并将其配置与文档中提到的完全相同。现在,我必须构建一个使用表单上传产品的应用程序。

我不知道如何继续前进。我想用简单的表单启动它,就好像现在,比如用户名和密码文本框一样。如何在django-cms页面中使用django表单?我也启用了代码段插件。我需要一些指导。

任何建议都是如此。 感谢

6 个答案:

答案 0 :(得分:15)

实际上bennylope提出的the solution并不是首选的方法,因为在插件中使用request.POST可能会产生非常糟糕的副作用(例如:如果同一个插件在页面上两次怎么办?或者如果有多个插件在同一页面上等待POST数据怎么办?当有一个POST到该页面时,这些插件会互相混淆。)

所以首选方式是:

  • 通过bennylope制作CMSPlugin as described,以呈现表单。
  • 将表单发布到静态挂钩视图(或apphooked视图),如果POST成功,则根据需要再次重定向到页面。

答案 1 :(得分:6)

假设您的产品应用程序按预期工作没有 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请求。

答案 2 :(得分:5)

我也是django-cms的新手,但ojii描述的方式似乎是最合理的:

  
      
  • 如上所述制作CMSPlugin以呈现表单。
  •   
  • 将表单发布到静态挂钩视图(或apphooked视图),如果POST成功,则根据需要再次重定向到页面。
  •   

然而对我来说这只是一个部分解决方案,因为我不仅想要在成功的情况下重定向回包含插件的cms页面,而且还需要显示形式错误的情况。重定向部分不是问题(我只是重定向回request.META [“HTTP_REFERER”]),但将表单(错误)移交给包含插件的cms页面的部分是棘手的。 我找到的唯一答案是:我使用一个会话(在静态视图中将表单写入会话,然后在插件的render方法中再次删除它)。不是最好的方式,但它的工作原理。 (如果cms插件配置支持某种方式重定向而不是渲染,会有更好的方法,但显然没有这样的选择:见http://groups.google.com/group/django-cms/browse_thread/thread/79ab6080c80bbcb5

答案 3 :(得分:5)

我最近遇到了django-form-designer

非常好,让你以一种所见即所得的方式设计表格。适用于独立的Django应用程序,并为Django-CMS提供了额外的插件。注意:除了Django-CMS安装说明之外,您还必须遵循独立说明。

来自github描述:

  

主要特点:

     
      
  • 从Django管理员处设计联系表单,搜索表单等,无需编写任何代码
  •   
  • 表格数据可以记录和CSV导出,通过电子邮件发送或转发到任何网址
  •   
  • 与Django CMS集成:向任何页面添加表单
  •   
  • 使用drag&删除以更改表单字段的位置
  •   
  • 完全可折叠的管理界面,可以更好地概览您的表单
  •   
  • 实现Django(TextField,EmailField,DateField等)附带的许多表单字段
  •   
  • Django提供的验证规则是完全可配置的(最大长度,正则表达式等)
  •   
  • 可自定义的消息和标签
  •   
  • 支持POST和GET表单
  •   

答案 4 :(得分:2)

这可能为时已晚,但我遇到了类似的问题,所以我创建了一个更通用的插件:https://github.com/metzlar/cms-form-plugin,这恰好与bennylope的答案非常相似。

答案 5 :(得分:1)

您可以通过抛出异常并将其捕获到中间件中来解决: http://djangosnippets.org/snippets/2541/