我正在尝试绑定FormView以在djangocms中显示表单,但我无法

时间:2018-09-28 00:00:47

标签: django-cms formview

我试图绑定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)

1 个答案:

答案 0 :(得分:0)

看看您在那里所拥有的东西,我不确定您是否为您的插件提供了合适的模型,但有视图!?表单类不是表单类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