限制访问Django的success_url()

时间:2016-11-30 14:34:08

标签: django django-forms django-views

这里有新的Django用户。 我试图在GET请求时限制对Django的success_url()的访问。我意识到我并不是第一个提出这个问题的人,但是,我特意尝试与Django的基于类的通用视图一起实现这一点。通用视图看起来更清晰,更快速,更具惯用性。我希望尽可能多地使用它们,除非它们完全不适合这项工作。

基本上,我正在为非用户创建一个简单的联系表单,这些用户只想在不创建帐户的情况下向我发送消息。我创建了一个联系人应用程序来处理这些类型的联系人。我创建了一个ModelForm,我使用带有Django的FormView的contact.html进行渲染。在一个人提交表单后,他们会收到一封很酷的感谢信息,用thanks.html呈现,它有自己的网址。

但是如果他们发布联系表格,我只希望他们看到感谢信息。目前,您可以访问我的网站并输入' / contact / thanks /',无论您是否提交了表单,都会显示我的thanks.html。 Django的success_url显然默认为GET请求。

以下是我的观点:

class MyContact(FormView):
    template_name = 'contact.html'
    form_class = ContactForm
    success_url = 'thanks'

这是我的表格:

ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        fields = ['email_address', 'message_body']

这是&contact.html中的html表单:

    <form action="" method="POST">{% csrf_token %}
    {{ form|crispy }}
    <button type="submit" class="send btn btn-secondary">Send Message</button>
    </form>

我的第一个想法是用这样的require_POST()装饰器装饰我的联系人应用程序网址:

urlpatterns = [
url(r'^thanks/$', require_POST(views.ThanksPageView.as_view()), name='thanks'),

这不起作用,因为Django的success_url()默认为GET请求。

最常用的方法是什么?由于Django是一个包括电池&#39;框架,我不想使用&#39; duck-tape&#39;,这意味着我不想在我的视图或网址中实现任何ad-hoc逻辑。

很抱歉,如果我在文档或问题档案中遗漏了任何内容。

1 个答案:

答案 0 :(得分:2)

由于您要求采用惯用法,我会考虑消息框架,特别是SuccessMessageMixin。这样您就可以将成功消息添加到例如联系表单本身和/thanks/页面的url-pattern不是必需的。