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

Python 如何在django cms中使用表单?,python,django,forms,content-management-system,django-cms,Python,Django,Forms,Content Management System,Django Cms,我是django cms的新手。我已经阅读了教程,并对其进行了与文档中提到的完全相同的配置。现在,我必须构建一个应用程序,它使用表单上传产品 我一点也不知道该怎么做。我想从简单的表单开始,比如用户名和密码文本框。如何在django cms页面中使用django表单?我也在里面启用了代码段插件。我需要一些指导 有什么建议吗。 谢谢假设您的产品应用程序在没有Django CMS的情况下能按预期工作,那么您接下来要做的就是创建自己的插件来显示表单。该插件将呈现您的表单,您已经使用创建的插件模板在自己的

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

我一点也不知道该怎么做。我想从简单的表单开始,比如用户名和密码文本框。如何在django cms页面中使用django表单?我也在里面启用了代码段插件。我需要一些指导

有什么建议吗。
谢谢

假设您的产品应用程序在没有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
另一个联系人表单插件展示了另一个示例。它只更新上下文,而不是呈现表单。好处是你不必创建一个单独的模板,但缺点是你失去了插件的模块性。这取决于呈现表单的页面模板

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

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

因此,首选的方法是:

  • 由bennylope制作一个CMSPlugin,以呈现表单
  • 将表单发布到静态挂钩视图(或apphooked视图),如果发布成功,如果需要,请再次重定向到页面

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

      • 如上所述制作一个CMSPlugin以呈现表单
      • 将表单发布到静态挂钩视图(或apphooked视图),如果发布成功,如果需要,请再次重定向到页面
      然而,对我来说,这只是一个部分解决方案,因为我不想在成功的情况下重定向回包含插件的cms页面,也不想在需要显示的表单错误的情况下重定向。重定向部分不是问题(我只是重定向回request.META[“HTTP_REFERER”]),而是移交表单的部分(错误)到包含插件的cms页面是很棘手的。
      我找到的唯一答案是:我使用一个会话(在静态视图中将表单写入会话,然后在插件的呈现方法中再次删除它)。这不是最好的方法,但它可以工作。(如果cms插件配置支持某种重定向而不是呈现的方式,那么会有更好的方法,但显然没有这样的选项:请参见)

      您可以通过抛出异常并在中间件中捕获它来解决问题: 我最近遇到过

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

      从github描述中:

      主要特点:

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

      这可能太晚了,但我遇到了一个类似的问题,所以我创建了一个更通用的插件:它恰好与bennylope的答案非常相似。

      好的,我明白你的意思。但是如果我创建一个插件,它的名称应该是什么?我应该保存在哪里?你可以随意命名插件。你应该做的是在apt中创建插件在您自己的应用程序中重新命名文件,然后向Django CMS注册您的插件。我强烈建议您参考,以了解如何创建基本插件,以及一些插件的来源。一旦您拥有数据处理视图(在应用程序中)表单插件只是在模板中呈现表单。但是,在发布到其他视图时,您如何向用户显示错误?如果您正在引用ojii的答案(这是解决此问题的方法),您可以通过以下两种方式之一显示错误:呈现单独的表单视图(在处理表单请求的URL端点处)或者通过AJAX做同样的事情。后者将提供更好的用户体验。我创建了一个插件来处理所有这些问题,因为我有一个类似的问题。看看我的答案,或者正如我所说的,我是django cms的绝对新手。我可以看一个cms插件的片段,以便更好地理解吗?即使下面的插件在同一个页面mul上使用有时,表单不是提交到CMS页面本身,而是提交到一个单独的视图(如我在回复的最后一句中所述)