16

我是 django-cms 的绝对新手。我已经完成了本教程,并按照文档中的说明对其进行了配置。现在,我必须构建一个使用表单上传产品的应用程序。

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

任何建议请。谢谢

4

6 回答 6

15

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

所以首选的方法是:

  • 按照 bennylope的描述制作一个 CMSPlugin来呈现表单。
  • 将表单发布到静态挂钩视图(或应用挂钩视图),如果 POST 成功,如果需要,请再次重定向到页面。
于 2011-03-26T17:52:07.223 回答
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 请求。

于 2011-03-26T16:20:16.597 回答
6

我也是 django-cms 的新手,但是 ojii在他们的回答中描述的方式似乎是最合理的:

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

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

于 2011-05-17T11:39:19.767 回答
5

我最近遇到了django-form-designer

它非常好,可以让您以所见即所得的方式设计表单。适用于独立的 django 应用程序,并有一个用于 Django-CMS 的附加插件。注意:除了 Django-CMS 安装说明外,您还必须遵循独立说明。

来自 github 描述:

主要特点:

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

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

于 2014-01-31T00:01:01.380 回答
1

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

于 2011-09-06T18:28:28.760 回答