如何在django-cms中使用表单?
我对django-cms完全是个新手。我看过教程,并且按照文档上的说明配置了一切。现在,我需要建立一个应用程序,用来上传产品。
我对接下来该怎么做完全没有头绪。我想先从简单的表单开始,比如说,用户名和密码的输入框。我该如何在django-cms页面中使用django表单呢?我也启用了代码片段插件。我需要一些指导。
有什么建议吗,拜托了。谢谢!
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请求。
其实,bennylope 提出的解决方案并不是最好的方法,因为在插件中使用 request.POST 可能会带来很糟糕的后果。比如说,如果同一个插件在页面上出现了两次,或者页面上有多个插件都在等待 POST 数据,这些插件就会互相干扰,导致混乱。
所以,推荐的做法是:
- 按照 bennylope 的描述,制作一个 CMSPlugin 来渲染表单。
- 让表单提交到一个静态链接的视图(或者一个应用链接的视图),如果提交成功的话,可以选择再重定向回这个页面。
我最近发现了一个叫做 django-form-designer 的工具。
这个工具非常不错,可以让你以所见即所得的方式设计表单。它适用于独立的 Django 应用程序,并且还有一个额外的插件可以用于 Django-CMS。需要注意的是:安装时,你需要同时遵循独立版和 Django-CMS 的安装说明。
根据 GitHub 的描述:
主要功能:
- 可以在 Django 管理后台设计联系表单、搜索表单等,而无需写任何代码
- 表单数据可以记录并导出为 CSV 格式,发送到电子邮件,或者转发到任何网址
- 与 Django CMS 集成:可以将表单添加到任何页面
- 使用拖放功能来改变表单字段的位置
- 提供完全可折叠的管理界面,方便你更好地查看表单
- 实现了 Django 提供的多种表单字段(如文本字段、电子邮件字段、日期字段等)
- 可以完全配置 Django 提供的验证规则(如最大长度、正则表达式等)
- 可以自定义消息和标签
- 支持 POST 和 GET 表单