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

16 投票
6 回答
17765 浏览
提问于 2025-04-16 14:28

我对django-cms完全是个新手。我看过教程,并且按照文档上的说明配置了一切。现在,我需要建立一个应用程序,用来上传产品。

我对接下来该怎么做完全没有头绪。我想先从简单的表单开始,比如说,用户名和密码的输入框。我该如何在django-cms页面中使用django表单呢?我也启用了代码片段插件。我需要一些指导。

有什么建议吗,拜托了。谢谢!

6 个回答

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请求。

15

其实,bennylope 提出的解决方案并不是最好的方法,因为在插件中使用 request.POST 可能会带来很糟糕的后果。比如说,如果同一个插件在页面上出现了两次,或者页面上有多个插件都在等待 POST 数据,这些插件就会互相干扰,导致混乱。

所以,推荐的做法是:

  • 按照 bennylope 的描述,制作一个 CMSPlugin 来渲染表单。
  • 让表单提交到一个静态链接的视图(或者一个应用链接的视图),如果提交成功的话,可以选择再重定向回这个页面。
6

我最近发现了一个叫做 django-form-designer 的工具。

这个工具非常不错,可以让你以所见即所得的方式设计表单。它适用于独立的 Django 应用程序,并且还有一个额外的插件可以用于 Django-CMS。需要注意的是:安装时,你需要同时遵循独立版和 Django-CMS 的安装说明。

根据 GitHub 的描述:

主要功能:

  • 可以在 Django 管理后台设计联系表单、搜索表单等,而无需写任何代码
  • 表单数据可以记录并导出为 CSV 格式,发送到电子邮件,或者转发到任何网址
  • 与 Django CMS 集成:可以将表单添加到任何页面
  • 使用拖放功能来改变表单字段的位置
  • 提供完全可折叠的管理界面,方便你更好地查看表单
  • 实现了 Django 提供的多种表单字段(如文本字段、电子邮件字段、日期字段等)
  • 可以完全配置 Django 提供的验证规则(如最大长度、正则表达式等)
  • 可以自定义消息和标签
  • 支持 POST 和 GET 表单

撰写回答