限制访问Django的success_url()

Restricting Access to Django's success_url()

此处是Django新用户。
我试图根据GET请求限制对Django \\的success_url()的访问。我意识到我不是第一个提出这个问题的人,但是,我正在特别尝试结合Django的基于类的通用视图来实现这一点。通用视图似乎更干净,更快,更惯用。我想尽可能多地使用它们,除非它们绝对不适合这份工作。

基本上,我正在为仅希望向我发送消息而不创建帐户的非用户创建一个简单的联系表单。我已经创建了一个联系人应用程序来处理这些类型的联系人。我创建了一个ModelForm,并使用Django的FormView通过contact.html进行渲染。一个人提交表格后,他们会收到一个很酷的感谢消息,该消息由thank.html呈现,具有自己的URL。

但是,我只希望他们在发布联系表单后才能看到"谢谢"消息。目前,您可以在我的网站上输入\\'/ contact / thanks / \\',无论您是否提交表单,都会显示我的thank.html。 Django \\的success_url显然默认为GET请求。

这是我的观点:

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

这是我的表格:

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

这是contact.html中的html表单:

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

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

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

]

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

最惯用的方法是什么?由于Django是一个" batteries included "框架,所以我不想使用\\'duck-tape \\',这意味着我不想在我的视图或URL中实现任何即席逻辑。

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


由于您正在寻求惯用的方法,因此我将考虑消息框架,尤其是SuccessMessageMixin。这将允许您将成功消息添加到例如联系人表单本身和/thanks/页面的url模式将是不必要的。