我有两个单独的基于类的视图,并希望保持其功能,并让两个CBV指向同一个模板(我试图将两个单独的表单放入一个页面).
更具体地说,我试图将这个电子邮件视图和这个密码更改视图子类化/组合,以便我可以让它们指向同一个模板,因为我最终希望两个表单在同一页面上.
我试图通过将它们子类化到我自己的视图中来做到这一点:
class MyEmailUpdateView(LoginRequiredMixin, EmailView):
template_name = 'account/account_settings'
success_url = reverse_lazy('settings')
def form_valid(self, form):
return super(SettingsUpdateView, self).form_valid(form)
class MyPasswordUpdateView(LoginRequiredMixin, PasswordChangeView):
template_name = 'account/account_settings'
success_url = reverse_lazy('settings')
def form_valid(self, form):
return super(SettingsUpdateView, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)
但我现在发现由于错误,一个接一个地说,除非我手动将它传入(success_url,方法等),否则父类中的任何内容实际上都没有转移到我的自定义类.即便如此,我正在子类化的原始类中的代码也指向其他地方.
那么,当组合这两个视图时,我是否需要将所有原始代码复制到我的自定义子类视图中?
这是实现它的正确方法吗?我如何结合这两个视图?我最终想找到一种方法,在我自己的应用程序中将它们的两个表单放在一个页面上.是否有可能使用库提供的模板更简单的方法来实现这一目标?
小智 5
您可以使用Django Multi Form View在视图中组合多个表单
安装后你可以像下面这样使用它:
class MultiFView(MultiFormView):
form_classes = {
'email_form' : AddEmailForm,
'change_password_form' : ChangePasswordForm
}
record_id = None
template_name = 'web/multi.html'
def forms_valid(self, forms):
email = forms['email_form'].save(commit=False)
email.save()
return super(MultiFView, self).forms_valid(forms)
Run Code Online (Sandbox Code Playgroud)
并在模板中:
{{ forms.email_form.as_p }}
{{ forms.change_password_form.as_p }}
Run Code Online (Sandbox Code Playgroud)