【问题标题】:I am trying to bind my FormView to show the Form in djangocms but i am not able to我正在尝试绑定我的 FormView 以在 djangocms 中显示表单,但我无法
【发布时间】:2018-09-28 00:00:46
【问题描述】:

我正在尝试绑定我的FormView 以在 djangocms 中显示Form,但我不能, 我的模型是:

class ContactFormView(FormView, CMSPlugin):
    template = '/ContactForm/ContactForm.html'
    form_class = contact_form
    success_url = reverse_lazy('success-page')

    def post(self, request, **kwargs):
        assert request.is_ajax()
        request_data = json.loads(request.body)
        form = self.form_class(data=request_data[self.form_class.scope_prefix])
        if form.is_valid():
            return JsonResponse({'success_url': force_text(self.success_url)})
        else:
            response_data = {form.form_name: form.errors}
            return JsonResponse(response_data, status=422)

cms_plugins.py:

class ContactFormPlugin(CMSPluginBase):
    model = ContactForm.ContactFormView
    render_template = '/ContactForm/ContactForm.html'
    name = 'Contact Form'
    allow_children = False

plugin_pool.register_plugin(ContactFormPlugin)

【问题讨论】:

  • 您收到什么错误信息。 “我不能”是不够的信息。
  • 表单没有显示在视图中,这是我的问题,没有调试/运行时错误

标签: django-cms formview


【解决方案1】:

看看你有什么,我不确定你给你的插件一个合适的模型而是一个视图!?表单类不是表单类,form_class = contact_form,但 contact_form 是什么?您需要将其作为表单的类,例如

class ContactForm(forms.Form):
    name = forms.CharField(label='Your name', max_length=100)
    email = forms.EmailField(label='Your email', max_length=100)


class ContactFormView(FormView):
    template = '/ContactForm/ContactForm.html'
    form_class = ContactForm
    success_url = reverse_lazy('success-page')

如果你有一个表单想要你的插件呈现,你需要告诉它要做什么......

from cms.models.pluginmodel import CMSPlugin

class ContactFormPlugin(CMSPluginBase):
    model = CMSPlugin
    render_template = '/ContactForm/ContactForm.html'
    name = 'Contact Form'
    allow_children = False

    def render(self, context, instance, placeholder):
        context = super(ContactFormPlugin, self).render(context, instance, placeholder)
        context['form'] = ContactForm()
        return context

但是,您使用的是 CMS 插件,因此您根本不需要为插件定义 View。我认为你可以让它做你想做的事情,但视图不想继承CMSPlugin,因为你只想让视图从插件接收数据。

如果您需要定义视图,那么您正在构建的应用程序在 CMS 中需要 Apphook,而不是插件。 (从技术上讲,您可以在没有 Apphook 的情况下发布到 URL,但这取决于您想要多少 CMS 集成)

有一个很好的例子,它从将插件发布到视图开始,然后进入应用程序集成,这在此处是可能的; http://docs.django-cms.org/en/latest/introduction/plugins.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 2021-12-19
    • 2022-01-21
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多