使用 FormView django 在 form_valid 中渲染模板而不是 success_url

Posted

技术标签:

【中文标题】使用 FormView django 在 form_valid 中渲染模板而不是 success_url【英文标题】:Render a template instead a success_url in form_valid with FormView django 【发布时间】:2015-08-24 23:06:19 【问题描述】:

正如标题所说:我需要在提交表单后渲染一个模板,这个表单是用FormView处理的,方法是form_valid。使用post方法,我可以在提交模板后渲染模板,但也许使用form_valid,我可以以最干净的方式完成。

我该怎么做?

【问题讨论】:

不,您不需要这样做。重定向到呈现此模板的另一个 url。 @DanielRoseman 谢谢,我已经尝试过了,但没有解决我的问题,因为这个模板只有在用户填写表格时才会显示,如果用户知道该模板的 url 可以访问该模板模板只输入网址 【参考方案1】:

form_valid的默认实现是重定向到success_url,你只需要重写它来渲染一些页面。这是一个例子。

class ChangePasswordPage(FormView):
    template_name = 'core/password-change.html'
    form_class = PasswordChangeForm

    def form_valid(self, form):
        form.save()
        messages.success(self.request, "Your password is changed")
        return render(self.request, 'core/password-change-success.html', self.get_context_data())

【讨论】:

我想知道为什么默认情况下不提供此选项,而您必须使用这种 hacky 方式来实现这一点。我的意思是谁希望他们的用户在没有上下文的情况下直接访问/success/?谁想为搜索引擎创建忽略规则以跳过此页面?如果您可以简单地呈现成功模板,谁愿意创建另一个视图并向 urlconf 添加另一个 url。为什么这个选项不是默认的,我想我错过了什么

以上是关于使用 FormView django 在 form_valid 中渲染模板而不是 success_url的主要内容,如果未能解决你的问题,请参考以下文章

当包含在其他模板中时,Django 通用 FormView 不显示

python Django(极端情况):如何在FormView(CreateView / UpdateView)的form_valid方法中引发表单无效并添加错误消息

Django:如何使用FormView和ajax将对象保存到数据库?

将参数传递给FormView Django中的表单

对 FormView 中的 get_form_kwargs 感到好奇

django - 使用 FormView 和 ModelForm 更新模型