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

Mav*_*ick 14 python forms django content-management-system django-cms

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

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

有任何建议.谢谢

oji*_*jii 15

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

所以首选方式是:

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

  • 如果表单没有验证怎么办?正如lentschi指出的那样,这是不可接受的. (4认同)

Ben*_*tin 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
Run Code Online (Sandbox Code Playgroud)

该模板将包括呈现表单所需的所有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
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,您仍然需要定义视图以接受表单提交,这意味着您需要在CMS之外创建一个视图,确认收到具有自己模板的表单,将用户重定向回引用页面,以及/或接受AJAX请求.


小智 6

我也是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)


小智 5

我最近碰到了django-form-designer

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

来自github描述:

主要特点:

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